From 83cb2c599c82c6296f016a5435f46be9a06a422a Mon Sep 17 00:00:00 2001 From: liya-zhu Date: Tue, 15 Oct 2024 20:31:30 -0400 Subject: [PATCH 01/17] Added user animal type table --- ...00.23.02.create-user-animal-types-table.ts | 36 +++++++++++++++++++ backend/typescript/models/animalType.model.ts | 7 +++- backend/typescript/models/user.model.ts | 8 ++++- .../typescript/models/userAnimalType.model.ts | 27 ++++++++++++++ 4 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 backend/typescript/migrations/2024.10.04T00.23.02.create-user-animal-types-table.ts create mode 100644 backend/typescript/models/userAnimalType.model.ts diff --git a/backend/typescript/migrations/2024.10.04T00.23.02.create-user-animal-types-table.ts b/backend/typescript/migrations/2024.10.04T00.23.02.create-user-animal-types-table.ts new file mode 100644 index 0000000..3193e89 --- /dev/null +++ b/backend/typescript/migrations/2024.10.04T00.23.02.create-user-animal-types-table.ts @@ -0,0 +1,36 @@ +import { DataType } from "sequelize-typescript"; + +import { Migration } from "../umzug"; + +const TABLE_NAME = "user_animal_types"; + +export const up: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().createTable(TABLE_NAME, { + user_id: { + type: DataType.INTEGER, + allowNull: false, + primaryKey: true, + references: { + model: "users", + key: "id" + }, + onUpdate: 'CASCADE', + onDelete: 'CASCADE', + }, + animal_type_id: { + type: DataType.INTEGER, + allowNull: false, + primaryKey: true, + references: { + model: "animal_types", + key: "id" + }, + onUpdate: 'CASCADE', + onDelete: 'CASCADE' + } + }); +} + +export const down: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().dropTable(TABLE_NAME); +}; diff --git a/backend/typescript/models/animalType.model.ts b/backend/typescript/models/animalType.model.ts index 3cc102a..5f284a9 100644 --- a/backend/typescript/models/animalType.model.ts +++ b/backend/typescript/models/animalType.model.ts @@ -1,7 +1,12 @@ -import { Column, Model, Table } from "sequelize-typescript"; +import { Column, Model, Table, BelongsToMany } from "sequelize-typescript"; +import UserAnimalType from "./userAnimalType.model"; +import User from "./user.model"; @Table({ timestamps: false, tableName: "animal_types" }) export default class AnimalType extends Model { @Column({}) animal_type_name!: string; + + @BelongsToMany(() => User, () => UserAnimalType) + users!: User[]; } diff --git a/backend/typescript/models/user.model.ts b/backend/typescript/models/user.model.ts index 928c641..6bac2a6 100644 --- a/backend/typescript/models/user.model.ts +++ b/backend/typescript/models/user.model.ts @@ -4,8 +4,11 @@ import { Model, Table, AllowNull, + BelongsToMany, } from "sequelize-typescript"; import { Role, UserStatus } from "../types"; +import AnimalType from "./animalType.model"; +import UserAnimalType from "./userAnimalType.model"; @Table({ tableName: "users" }) export default class User extends Model { @@ -39,4 +42,7 @@ export default class User extends Model { @Column({ type: DataType.ENUM("Active", "Inactive"), allowNull: false }) status!: UserStatus; -} + + @BelongsToMany(() => AnimalType, () => UserAnimalType) + animalTypes!: AnimalType[]; +} \ No newline at end of file diff --git a/backend/typescript/models/userAnimalType.model.ts b/backend/typescript/models/userAnimalType.model.ts new file mode 100644 index 0000000..fc3115e --- /dev/null +++ b/backend/typescript/models/userAnimalType.model.ts @@ -0,0 +1,27 @@ +import { + Column, + DataType, + Model, + Table, + ForeignKey, + PrimaryKey +} from 'sequelize-typescript'; +import User from './user.model'; +import AnimalType from './animalType.model'; + +@Table({ + tableName: 'User_AnimalTypes', + timestamps: true +}) +export default class UserAnimalType extends Model { + @ForeignKey(() => User) + @PrimaryKey + @Column({ type:DataType.INTEGER, allowNull: false }) + user_id!: number; + + @ForeignKey(() => AnimalType) + @PrimaryKey + @Column({ type: DataType.INTEGER, allowNull: false }) + animal_type_id!: number; +} + From 6c528cfa7598e828aa28e5e9ca0f74d427451a97 Mon Sep 17 00:00:00 2001 From: liya-zhu Date: Thu, 17 Oct 2024 18:54:16 -0400 Subject: [PATCH 02/17] Fixed circular dependencies linter error --- backend/typescript/models/animalType.model.ts | 8 +++++--- backend/typescript/models/user.model.ts | 8 +++++--- backend/typescript/models/userAnimalType.model.ts | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/backend/typescript/models/animalType.model.ts b/backend/typescript/models/animalType.model.ts index 5f284a9..84ef34d 100644 --- a/backend/typescript/models/animalType.model.ts +++ b/backend/typescript/models/animalType.model.ts @@ -1,12 +1,14 @@ import { Column, Model, Table, BelongsToMany } from "sequelize-typescript"; -import UserAnimalType from "./userAnimalType.model"; -import User from "./user.model"; +import type User from "./user.model"; @Table({ timestamps: false, tableName: "animal_types" }) export default class AnimalType extends Model { @Column({}) animal_type_name!: string; - @BelongsToMany(() => User, () => UserAnimalType) + @BelongsToMany( + () => import("./user.model").then((mod) => mod.default), + () => import("./userAnimalType.model").then((mod) => mod.default), + ) users!: User[]; } diff --git a/backend/typescript/models/user.model.ts b/backend/typescript/models/user.model.ts index 6bac2a6..bfe6f24 100644 --- a/backend/typescript/models/user.model.ts +++ b/backend/typescript/models/user.model.ts @@ -7,8 +7,7 @@ import { BelongsToMany, } from "sequelize-typescript"; import { Role, UserStatus } from "../types"; -import AnimalType from "./animalType.model"; -import UserAnimalType from "./userAnimalType.model"; +import type AnimalType from "./animalType.model"; @Table({ tableName: "users" }) export default class User extends Model { @@ -43,6 +42,9 @@ export default class User extends Model { @Column({ type: DataType.ENUM("Active", "Inactive"), allowNull: false }) status!: UserStatus; - @BelongsToMany(() => AnimalType, () => UserAnimalType) + @BelongsToMany( + () => import("./animalType.model").then((mod) => mod.default), + () => import("./userAnimalType.model").then((mod) => mod.default), + ) animalTypes!: AnimalType[]; } \ No newline at end of file diff --git a/backend/typescript/models/userAnimalType.model.ts b/backend/typescript/models/userAnimalType.model.ts index fc3115e..0047bc1 100644 --- a/backend/typescript/models/userAnimalType.model.ts +++ b/backend/typescript/models/userAnimalType.model.ts @@ -16,7 +16,7 @@ import AnimalType from './animalType.model'; export default class UserAnimalType extends Model { @ForeignKey(() => User) @PrimaryKey - @Column({ type:DataType.INTEGER, allowNull: false }) + @Column({ type: DataType.INTEGER, allowNull: false }) user_id!: number; @ForeignKey(() => AnimalType) From c74987735bada90e4f17ad5345f057906c61aff7 Mon Sep 17 00:00:00 2001 From: laks0407 Date: Thu, 24 Oct 2024 19:06:37 -0400 Subject: [PATCH 03/17] created forgot password frontend --- frontend/src/App.tsx | 7 + .../src/components/pages/ForgotPassword.tsx | 183 ++++++++++++++++++ .../src/components/pages/login_background.png | Bin 0 -> 107441 bytes .../pages/login_background_phone.png | Bin 0 -> 43441 bytes frontend/src/constants/Routes.ts | 2 + 5 files changed, 192 insertions(+) create mode 100644 frontend/src/components/pages/ForgotPassword.tsx create mode 100644 frontend/src/components/pages/login_background.png create mode 100644 frontend/src/components/pages/login_background_phone.png diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index b65ddca..2409c59 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -5,6 +5,7 @@ import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; import Default from "./components/pages/Default"; import Login from "./components/auth/Login"; import Signup from "./components/auth/Signup"; +import ForgotPasswordPage from "./components/pages/ForgotPassword" import PrivateRoute from "./components/auth/PrivateRoute"; import CreatePage from "./components/pages/CreatePage"; import PetListPage from "./components/pages/PetListPage"; @@ -59,6 +60,12 @@ const App = (): React.ReactElement => { + { + const [validUser, setValidUser] = useState(true); + const [sentEmail, setSentEmail] = useState(false); + const [sentEmailToUser, setSentEmailToUser] = useState(false); + const [userEmailId, setUserEmaild] = useState(""); + + const handleUserAuth = (userEmail: string) => { + const emailPattern = /^[^\s@]+@humanesociety\.org$/; + const sentEmails: SentEmail[] = JSON.parse(localStorage.getItem("sentEmails") || "[]"); + if (!emailPattern.test(userEmail)) { + setValidUser(false); + } else if (sentEmails.some(item => item.email === userEmail)) { + setSentEmailToUser(true); + } else { + // make API call to check if user exists + setValidUser(true); + setSentEmail(true); + // send email logic + const newEmail: SentEmail = { + email: userEmail, + timestamp: new Date().getTime() + } + sentEmails.push(newEmail); + localStorage.setItem("sentEmails", JSON.stringify(sentEmails)); + setTimeout(() => { + const updatedSentEmails: SentEmail[] = JSON.parse(localStorage.getItem("sentEmails") || "[]"); + const filteredEmails = updatedSentEmails.filter( + (item: SentEmail) => item.email !== userEmail + ); + localStorage.setItem("sentEmails", JSON.stringify(filteredEmails)); + }, 60000); + } + }; + + const handleInputChange = (e: React.ChangeEvent) => { + if (sentEmail) { + setSentEmail(false); + } else if (sentEmailToUser) { + setSentEmailToUser(false) + } + setUserEmaild(e.target.value); + }; + + return ( + + + + Forgot Password? + + + Please enter the email address associated with your account to reset + your password. + + + + Email: + + + + {!validUser && ( + + Please enter a valid email. + + )} + + + + {sentEmail && ( + + A password reset link has been sent to your email! + + )} + {sentEmailToUser && ( + + You have already sent an email to this user + + )} + + + ); +}; + +export default ForgotPassword; diff --git a/frontend/src/components/pages/login_background.png b/frontend/src/components/pages/login_background.png new file mode 100644 index 0000000000000000000000000000000000000000..54dbc28e0aa020924f6c511e5d0558c78915ee38 GIT binary patch literal 107441 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

HY`_O9S21J{~G>>VygRJUFn2k2Yg`? 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 literal 0 HcmV?d00001 diff --git a/frontend/src/constants/Routes.ts b/frontend/src/constants/Routes.ts index 63fc726..21e0d7b 100644 --- a/frontend/src/constants/Routes.ts +++ b/frontend/src/constants/Routes.ts @@ -4,6 +4,8 @@ export const LOGIN_PAGE = "/login"; export const SIGNUP_PAGE = "/signup"; +export const FORGOT_PASSWORD_PAGE = "/forgotPassword"; + export const EDIT_TEAM_PAGE = "/edit-team"; export const DISPLAY_ENTITY_PAGE = "/entity"; From 72b3603f8bce6f281ba30e21a2c6f6628c028a1d Mon Sep 17 00:00:00 2001 From: laks0407 Date: Thu, 24 Oct 2024 20:16:43 -0400 Subject: [PATCH 04/17] small bug fix --- frontend/src/components/pages/ForgotPassword.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/pages/ForgotPassword.tsx b/frontend/src/components/pages/ForgotPassword.tsx index 8154f6d..8be348f 100644 --- a/frontend/src/components/pages/ForgotPassword.tsx +++ b/frontend/src/components/pages/ForgotPassword.tsx @@ -28,6 +28,8 @@ const ForgotPassword = (): React.ReactElement => { if (!emailPattern.test(userEmail)) { setValidUser(false); } else if (sentEmails.some(item => item.email === userEmail)) { + setValidUser(true); + setSentEmail(false); setSentEmailToUser(true); } else { // make API call to check if user exists @@ -46,16 +48,15 @@ const ForgotPassword = (): React.ReactElement => { (item: SentEmail) => item.email !== userEmail ); localStorage.setItem("sentEmails", JSON.stringify(filteredEmails)); + setSentEmailToUser(false) }, 60000); } }; const handleInputChange = (e: React.ChangeEvent) => { - if (sentEmail) { - setSentEmail(false); - } else if (sentEmailToUser) { - setSentEmailToUser(false) - } + setValidUser(true) + setSentEmail(false); + setSentEmailToUser(false); setUserEmaild(e.target.value); }; @@ -172,7 +173,7 @@ const ForgotPassword = (): React.ReactElement => { lineHeight="120%" marginTop="16px" > - You have already sent an email to this user + You have already sent an email to this user. )} From 83d222fc4dc225540a28dfa76506554203641ccb Mon Sep 17 00:00:00 2001 From: liya-zhu Date: Tue, 29 Oct 2024 20:35:42 -0400 Subject: [PATCH 05/17] Moved BelongsToMany relationship to new file --- ...00.23.02.create-user-animal-types-table.ts | 16 +++++------ backend/typescript/models/animalType.model.ts | 9 +------ backend/typescript/models/index.ts | 12 ++++++++- .../typescript/models/modelRelationships.ts | 7 +++++ backend/typescript/models/user.model.ts | 10 +------ .../typescript/models/userAnimalType.model.ts | 27 +++++++++---------- 6 files changed, 41 insertions(+), 40 deletions(-) create mode 100644 backend/typescript/models/modelRelationships.ts diff --git a/backend/typescript/migrations/2024.10.04T00.23.02.create-user-animal-types-table.ts b/backend/typescript/migrations/2024.10.04T00.23.02.create-user-animal-types-table.ts index 3193e89..6b8b7af 100644 --- a/backend/typescript/migrations/2024.10.04T00.23.02.create-user-animal-types-table.ts +++ b/backend/typescript/migrations/2024.10.04T00.23.02.create-user-animal-types-table.ts @@ -12,10 +12,10 @@ export const up: Migration = async ({ context: sequelize }) => { primaryKey: true, references: { model: "users", - key: "id" + key: "id", }, - onUpdate: 'CASCADE', - onDelete: 'CASCADE', + onUpdate: "CASCADE", + onDelete: "CASCADE", }, animal_type_id: { type: DataType.INTEGER, @@ -23,13 +23,13 @@ export const up: Migration = async ({ context: sequelize }) => { primaryKey: true, references: { model: "animal_types", - key: "id" + key: "id", }, - onUpdate: 'CASCADE', - onDelete: 'CASCADE' - } + onUpdate: "CASCADE", + onDelete: "CASCADE", + }, }); -} +}; export const down: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().dropTable(TABLE_NAME); diff --git a/backend/typescript/models/animalType.model.ts b/backend/typescript/models/animalType.model.ts index 84ef34d..3cc102a 100644 --- a/backend/typescript/models/animalType.model.ts +++ b/backend/typescript/models/animalType.model.ts @@ -1,14 +1,7 @@ -import { Column, Model, Table, BelongsToMany } from "sequelize-typescript"; -import type User from "./user.model"; +import { Column, Model, Table } from "sequelize-typescript"; @Table({ timestamps: false, tableName: "animal_types" }) export default class AnimalType extends Model { @Column({}) animal_type_name!: string; - - @BelongsToMany( - () => import("./user.model").then((mod) => mod.default), - () => import("./userAnimalType.model").then((mod) => mod.default), - ) - users!: User[]; } diff --git a/backend/typescript/models/index.ts b/backend/typescript/models/index.ts index 0ca9ed2..68a973e 100644 --- a/backend/typescript/models/index.ts +++ b/backend/typescript/models/index.ts @@ -1,5 +1,9 @@ import * as path from "path"; import { Sequelize } from "sequelize-typescript"; +import User from "./user.model"; +import AnimalType from "./animalType.model"; +import UserAnimalType from "./userAnimalType.model"; +import defineRelationships from "./modelRelationships"; const DATABASE_URL = process.env.NODE_ENV === "production" @@ -8,6 +12,12 @@ const DATABASE_URL = : `postgres://${process.env.POSTGRES_USER}:${process.env.POSTGRES_PASSWORD}@${process.env.DB_HOST}:5432/${process.env.POSTGRES_DB_DEV}`; /* eslint-disable-next-line import/prefer-default-export */ -export const sequelize = new Sequelize(DATABASE_URL, { +const sequelize = new Sequelize(DATABASE_URL, { models: [path.join(__dirname, "/*.model.ts")], }); + +sequelize.addModels([User, AnimalType, UserAnimalType]); + +defineRelationships(); + +export { sequelize, User, AnimalType, UserAnimalType }; diff --git a/backend/typescript/models/modelRelationships.ts b/backend/typescript/models/modelRelationships.ts new file mode 100644 index 0000000..3dfcad1 --- /dev/null +++ b/backend/typescript/models/modelRelationships.ts @@ -0,0 +1,7 @@ +import User from "./user.model"; +import AnimalType from "./animalType.model"; +import UserAnimalType from "./userAnimalType.model"; + +export default function defineRelationships(): void { + User.belongsToMany(AnimalType, { through: UserAnimalType }); +} diff --git a/backend/typescript/models/user.model.ts b/backend/typescript/models/user.model.ts index bfe6f24..928c641 100644 --- a/backend/typescript/models/user.model.ts +++ b/backend/typescript/models/user.model.ts @@ -4,10 +4,8 @@ import { Model, Table, AllowNull, - BelongsToMany, } from "sequelize-typescript"; import { Role, UserStatus } from "../types"; -import type AnimalType from "./animalType.model"; @Table({ tableName: "users" }) export default class User extends Model { @@ -41,10 +39,4 @@ export default class User extends Model { @Column({ type: DataType.ENUM("Active", "Inactive"), allowNull: false }) status!: UserStatus; - - @BelongsToMany( - () => import("./animalType.model").then((mod) => mod.default), - () => import("./userAnimalType.model").then((mod) => mod.default), - ) - animalTypes!: AnimalType[]; -} \ No newline at end of file +} diff --git a/backend/typescript/models/userAnimalType.model.ts b/backend/typescript/models/userAnimalType.model.ts index 0047bc1..c5503b5 100644 --- a/backend/typescript/models/userAnimalType.model.ts +++ b/backend/typescript/models/userAnimalType.model.ts @@ -1,19 +1,19 @@ -import { - Column, - DataType, - Model, - Table, - ForeignKey, - PrimaryKey -} from 'sequelize-typescript'; -import User from './user.model'; -import AnimalType from './animalType.model'; +import { + Column, + DataType, + Model, + Table, + ForeignKey, + PrimaryKey, +} from "sequelize-typescript"; +import User from "./user.model"; +import AnimalType from "./animalType.model"; @Table({ - tableName: 'User_AnimalTypes', - timestamps: true + tableName: "User_AnimalTypes", + timestamps: true, }) -export default class UserAnimalType extends Model { +export default class UserAnimalType extends Model { @ForeignKey(() => User) @PrimaryKey @Column({ type: DataType.INTEGER, allowNull: false }) @@ -24,4 +24,3 @@ export default class UserAnimalType extends Model { @Column({ type: DataType.INTEGER, allowNull: false }) animal_type_id!: number; } - From 1625588be1c03234d765336c559c03b29dba3ebc Mon Sep 17 00:00:00 2001 From: vips11 <66628544+vips11@users.noreply.github.com> Date: Tue, 5 Nov 2024 19:36:37 -0500 Subject: [PATCH 06/17] Added user_behaviours table and updated pet_behaviours table --- backend/typescript/constants.ts | 2 + ...29T20.20.02.create-user-behaviour-table.ts | 56 +++++++++++++++++++ ...0.29.50.add-user-behaviour-columns copy.ts | 36 ++++++++++++ .../typescript/models/petBehaviour.model.ts | 36 ++++++++++++ .../typescript/models/userBehaviour.model.ts | 30 ++++++++++ 5 files changed, 160 insertions(+) create mode 100644 backend/typescript/constants.ts create mode 100644 backend/typescript/migrations/2024.10.29T20.20.02.create-user-behaviour-table.ts create mode 100644 backend/typescript/migrations/2024.10.29T20.29.50.add-user-behaviour-columns copy.ts create mode 100644 backend/typescript/models/petBehaviour.model.ts create mode 100644 backend/typescript/models/userBehaviour.model.ts diff --git a/backend/typescript/constants.ts b/backend/typescript/constants.ts new file mode 100644 index 0000000..ffc0146 --- /dev/null +++ b/backend/typescript/constants.ts @@ -0,0 +1,2 @@ +export const MIN_BEHAVIOUR_LEVEL = 1; +export const MAX_BEHAVIOUR_LEVEL = 4; diff --git a/backend/typescript/migrations/2024.10.29T20.20.02.create-user-behaviour-table.ts b/backend/typescript/migrations/2024.10.29T20.20.02.create-user-behaviour-table.ts new file mode 100644 index 0000000..d440e2d --- /dev/null +++ b/backend/typescript/migrations/2024.10.29T20.20.02.create-user-behaviour-table.ts @@ -0,0 +1,56 @@ +import { DataType } from "sequelize-typescript"; + +import { Migration } from "../umzug"; +import { MAX_BEHAVIOUR_LEVEL, MIN_BEHAVIOUR_LEVEL } from "../constants"; + +const TABLE_NAME = "user_behaviours"; +const CONSTRAINT_NAME = "unique_user_behaviour_skill"; + +export const up: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().createTable(TABLE_NAME, { + id: { + type: DataType.INTEGER, + allowNull: false, + primaryKey: true, + autoIncrement: true, + }, + user_id: { + type: DataType.INTEGER, + allowNull: false, + references: { + model: "users", + key: "id", + }, + }, + behaviour_id: { + type: DataType.INTEGER, + allowNull: false, + references: { + model: "behaviours", + key: "id", + }, + }, + max_level: { + type: DataType.INTEGER, + validate: { + min: MIN_BEHAVIOUR_LEVEL, + max: MAX_BEHAVIOUR_LEVEL, + }, + allowNull: false, + }, + }); + + await sequelize.getQueryInterface().addConstraint(TABLE_NAME, { + fields: ["behaviour_id", "user_id"], + type: "unique", + name: CONSTRAINT_NAME, + }); +}; + +export const down: Migration = async ({ context: sequelize }) => { + await sequelize + .getQueryInterface() + .removeConstraint(TABLE_NAME, CONSTRAINT_NAME); + + await sequelize.getQueryInterface().dropTable(TABLE_NAME); +}; diff --git a/backend/typescript/migrations/2024.10.29T20.29.50.add-user-behaviour-columns copy.ts b/backend/typescript/migrations/2024.10.29T20.29.50.add-user-behaviour-columns copy.ts new file mode 100644 index 0000000..16c86fa --- /dev/null +++ b/backend/typescript/migrations/2024.10.29T20.29.50.add-user-behaviour-columns copy.ts @@ -0,0 +1,36 @@ +import { DataType } from "sequelize-typescript"; +import { Migration } from "../umzug"; +import { MAX_BEHAVIOUR_LEVEL, MIN_BEHAVIOUR_LEVEL } from "../constants"; + +const TABLE_NAME = "pet_behaviours"; +const CONSTRAINT_NAME = "unique_pet_behaviour"; + +export const up: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().addColumn(TABLE_NAME, "level", { + type: DataType.INTEGER, + allowNull: false, + validate: { + min: MIN_BEHAVIOUR_LEVEL, + max: MAX_BEHAVIOUR_LEVEL, + }, + }); + + await sequelize.getQueryInterface().addColumn(TABLE_NAME, "is_highlighted", { + type: DataType.BOOLEAN, + allowNull: false, + }); + + await sequelize.getQueryInterface().addConstraint(TABLE_NAME, { + fields: ["behaviour_id", "pet_id"], + type: "unique", + name: CONSTRAINT_NAME, + }); +}; + +export const down: Migration = async ({ context: sequelize }) => { + await sequelize.getQueryInterface().removeColumn(TABLE_NAME, "level"); + + await sequelize + .getQueryInterface() + .removeColumn(TABLE_NAME, "is_highlighted"); +}; diff --git a/backend/typescript/models/petBehaviour.model.ts b/backend/typescript/models/petBehaviour.model.ts new file mode 100644 index 0000000..1e677b7 --- /dev/null +++ b/backend/typescript/models/petBehaviour.model.ts @@ -0,0 +1,36 @@ +import { + Column, + Model, + Table, + ForeignKey, + BelongsTo, + DataType, +} from "sequelize-typescript"; +import Behaviour from "./behaviour.model"; +import Pet from "./pet.model"; + +@Table({ timestamps: false, tableName: "pet_behaviours" }) +export default class PetBehaviour extends Model { + @ForeignKey(() => Pet) + @Column({ type: DataType.INTEGER, allowNull: false }) + pet_id!: number; + + @BelongsTo(() => Pet) + pet!: Pet; + + @ForeignKey(() => Behaviour) + @Column({ type: DataType.INTEGER, allowNull: false }) + behaviour_id!: number; + + @BelongsTo(() => Behaviour) + behaviour!: Behaviour; + + @Column({ type: DataType.INTEGER, allowNull: false }) + skill_level!: number; + + @Column({ type: DataType.INTEGER, allowNull: false }) + level!: number; + + @Column({ type: DataType.BOOLEAN, allowNull: false }) + is_highlighted!: boolean; +} diff --git a/backend/typescript/models/userBehaviour.model.ts b/backend/typescript/models/userBehaviour.model.ts new file mode 100644 index 0000000..3198945 --- /dev/null +++ b/backend/typescript/models/userBehaviour.model.ts @@ -0,0 +1,30 @@ +import { + Column, + Model, + Table, + ForeignKey, + BelongsTo, + DataType, +} from "sequelize-typescript"; +import Behaviour from "./behaviour.model"; +import User from "./user.model"; + +@Table({ timestamps: false, tableName: "user_behaviours" }) +export default class UserBehaviour extends Model { + @ForeignKey(() => User) + @Column({ type: DataType.INTEGER, allowNull: false }) + user_id!: number; + + @BelongsTo(() => User) + user!: User; + + @ForeignKey(() => Behaviour) + @Column({ type: DataType.INTEGER, allowNull: false }) + behaviour_id!: number; + + @BelongsTo(() => Behaviour) + behaviour!: Behaviour; + + @Column({ type: DataType.INTEGER, allowNull: false }) + max_level!: number; +} From b854f90abad664591697f9973a72981069cab44f Mon Sep 17 00:00:00 2001 From: laks0407 Date: Tue, 5 Nov 2024 19:53:19 -0500 Subject: [PATCH 07/17] linter fixes --- frontend/src/App.tsx | 2 +- .../src/components/pages/ForgotPassword.tsx | 22 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 0bfb321..d1289ce 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -5,7 +5,7 @@ import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; import Default from "./components/pages/Default"; import Login from "./components/auth/Login"; import Signup from "./components/auth/Signup"; -import ForgotPasswordPage from "./components/pages/ForgotPassword" +import ForgotPasswordPage from "./components/pages/ForgotPassword"; import PrivateRoute from "./components/auth/PrivateRoute"; import CreatePage from "./components/pages/CreatePage"; import PetListPage from "./components/pages/PetListPage"; diff --git a/frontend/src/components/pages/ForgotPassword.tsx b/frontend/src/components/pages/ForgotPassword.tsx index 8be348f..61a7632 100644 --- a/frontend/src/components/pages/ForgotPassword.tsx +++ b/frontend/src/components/pages/ForgotPassword.tsx @@ -24,10 +24,12 @@ const ForgotPassword = (): React.ReactElement => { const handleUserAuth = (userEmail: string) => { const emailPattern = /^[^\s@]+@humanesociety\.org$/; - const sentEmails: SentEmail[] = JSON.parse(localStorage.getItem("sentEmails") || "[]"); + const sentEmails: SentEmail[] = JSON.parse( + localStorage.getItem("sentEmails") || "[]", + ); if (!emailPattern.test(userEmail)) { setValidUser(false); - } else if (sentEmails.some(item => item.email === userEmail)) { + } else if (sentEmails.some((item) => item.email === userEmail)) { setValidUser(true); setSentEmail(false); setSentEmailToUser(true); @@ -38,23 +40,25 @@ const ForgotPassword = (): React.ReactElement => { // send email logic const newEmail: SentEmail = { email: userEmail, - timestamp: new Date().getTime() - } + timestamp: new Date().getTime(), + }; sentEmails.push(newEmail); localStorage.setItem("sentEmails", JSON.stringify(sentEmails)); setTimeout(() => { - const updatedSentEmails: SentEmail[] = JSON.parse(localStorage.getItem("sentEmails") || "[]"); + const updatedSentEmails: SentEmail[] = JSON.parse( + localStorage.getItem("sentEmails") || "[]", + ); const filteredEmails = updatedSentEmails.filter( - (item: SentEmail) => item.email !== userEmail + (item: SentEmail) => item.email !== userEmail, ); localStorage.setItem("sentEmails", JSON.stringify(filteredEmails)); - setSentEmailToUser(false) + setSentEmailToUser(false); }, 60000); } }; const handleInputChange = (e: React.ChangeEvent) => { - setValidUser(true) + setValidUser(true); setSentEmail(false); setSentEmailToUser(false); setUserEmaild(e.target.value); @@ -62,7 +66,7 @@ const ForgotPassword = (): React.ReactElement => { return ( Date: Tue, 5 Nov 2024 20:57:08 -0500 Subject: [PATCH 08/17] Add user invitation modal to UserManagementPage --- frontend/src/components/crud/FormModal.tsx | 105 ++++++++++++++++++ .../components/pages/UserManagementPage.tsx | 32 +++++- 2 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/crud/FormModal.tsx diff --git a/frontend/src/components/crud/FormModal.tsx b/frontend/src/components/crud/FormModal.tsx new file mode 100644 index 0000000..c7813a3 --- /dev/null +++ b/frontend/src/components/crud/FormModal.tsx @@ -0,0 +1,105 @@ +import React, { useState } from "react"; +import { Modal, Button, Form } from "react-bootstrap"; + +interface FormModalProps { + show: boolean; + onClose: () => void; + handleSendInvite: (formData: { + firstName: string; + lastName: string; + phoneNumber: string; + email: string; + role: string; + }) => void; +} + +const FormModal: React.FC = ({ + show, + onClose, + handleSendInvite, +}) => { + const [formData, setFormData] = useState({ + firstName: "", + lastName: "", + phoneNumber: "", + email: "", + role: "", + }); + + const handleChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; + setFormData((prevData) => ({ ...prevData, [name]: value })); + }; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + handleSendInvite(formData); + }; + + return ( + + + Send Invite + + +

+ + First Name + + + + Last Name + + + + Phone Number + + + + Email + + + + Role + + + + + + + ); +}; + +export default FormModal; diff --git a/frontend/src/components/pages/UserManagementPage.tsx b/frontend/src/components/pages/UserManagementPage.tsx index cdc53b0..8910a08 100644 --- a/frontend/src/components/pages/UserManagementPage.tsx +++ b/frontend/src/components/pages/UserManagementPage.tsx @@ -13,9 +13,11 @@ import { import UserAPIClient from "../../APIClients/UserAPIClient"; import { User } from "../../types/UserTypes"; import MainPageButton from "../common/MainPageButton"; +import FormModal from "../crud/FormModal"; const UserManagementPage = (): React.ReactElement => { const [users, setUsers] = useState([]); + const [isModalOpen, setIsModalOpen] = useState(false); const getUsers = async () => { try { @@ -28,6 +30,29 @@ const UserManagementPage = (): React.ReactElement => { } }; + const addUser = async () => { + try { + setIsModalOpen(true); + } catch (error) { + /* TODO: error handling */ + } + }; + + const closeModal = () => { + setIsModalOpen(false); + }; + + const handleSendInvite = (formData: { + firstName: string; + lastName: string; + phoneNumber: string; + email: string; + role: string; + }) => { + // eslint-disable-next-line no-console + console.log(`Invite sent to ${formData.email}`); + }; + useEffect(() => { getUsers(); }, []); @@ -56,7 +81,12 @@ const UserManagementPage = (): React.ReactElement => { - + + From 76db079b5f2c88a2ff588449c9fe5724115a9d90 Mon Sep 17 00:00:00 2001 From: laks0407 Date: Mon, 11 Nov 2024 18:06:15 -0500 Subject: [PATCH 09/17] UI fixes --- .../src/components/pages/ForgotPassword.tsx | 131 ++++++++---------- 1 file changed, 57 insertions(+), 74 deletions(-) diff --git a/frontend/src/components/pages/ForgotPassword.tsx b/frontend/src/components/pages/ForgotPassword.tsx index 61a7632..33e9e6f 100644 --- a/frontend/src/components/pages/ForgotPassword.tsx +++ b/frontend/src/components/pages/ForgotPassword.tsx @@ -1,12 +1,12 @@ import React, { useState } from "react"; import { Box, - Heading, Input, Text, Button, FormControl, FormErrorMessage, + Flex, } from "@chakra-ui/react"; import background from "./login_background.png"; import backgroundMobile from "./login_background_phone.png"; @@ -16,6 +16,23 @@ type SentEmail = { timestamp: number; }; +const StatusMessage: React.FC<{ message: string; color?: string }> = ({ + message, + color = "blue.700", +}) => { + return ( + + {message} + + ); +}; + const ForgotPassword = (): React.ReactElement => { const [validUser, setValidUser] = useState(true); const [sentEmail, setSentEmail] = useState(false); @@ -65,66 +82,52 @@ const ForgotPassword = (): React.ReactElement => { }; return ( - - Forgot Password? - - + + Please enter the email address associated with your account to reset your password. - + Email: @@ -136,52 +139,32 @@ const ForgotPassword = (): React.ReactElement => { onChange={handleInputChange} /> {!validUser && ( - + Please enter a valid email. )} + - {sentEmail && ( - - A password reset link has been sent to your email! - + )} {sentEmailToUser && ( - - You have already sent an email to this user. - + )} - + ); }; From 8546bd3366000950557e045910a74a2bb9ca45ed Mon Sep 17 00:00:00 2001 From: laks0407 Date: Mon, 11 Nov 2024 18:25:06 -0500 Subject: [PATCH 10/17] placed reusable component into /common --- .../src/components/common/StatusMessage.tsx | 22 +++++++++++++++++++ .../src/components/pages/ForgotPassword.tsx | 18 +-------------- 2 files changed, 23 insertions(+), 17 deletions(-) create mode 100644 frontend/src/components/common/StatusMessage.tsx diff --git a/frontend/src/components/common/StatusMessage.tsx b/frontend/src/components/common/StatusMessage.tsx new file mode 100644 index 0000000..67f6d4e --- /dev/null +++ b/frontend/src/components/common/StatusMessage.tsx @@ -0,0 +1,22 @@ +import React from "react"; +import { Text } from "@chakra-ui/react"; + +interface StatusMessageProps { + message: string; + color?: string; +} + +const StatusMessage = ({ message, color = "blue.700" }: StatusMessageProps): React.ReactElement => { + return ( + + {message} + + ); + }; + + export default StatusMessage; \ No newline at end of file diff --git a/frontend/src/components/pages/ForgotPassword.tsx b/frontend/src/components/pages/ForgotPassword.tsx index 33e9e6f..685aa43 100644 --- a/frontend/src/components/pages/ForgotPassword.tsx +++ b/frontend/src/components/pages/ForgotPassword.tsx @@ -8,6 +8,7 @@ import { FormErrorMessage, Flex, } from "@chakra-ui/react"; +import StatusMessage from "../common/StatusMessage"; import background from "./login_background.png"; import backgroundMobile from "./login_background_phone.png"; @@ -16,23 +17,6 @@ type SentEmail = { timestamp: number; }; -const StatusMessage: React.FC<{ message: string; color?: string }> = ({ - message, - color = "blue.700", -}) => { - return ( - - {message} - - ); -}; - const ForgotPassword = (): React.ReactElement => { const [validUser, setValidUser] = useState(true); const [sentEmail, setSentEmail] = useState(false); From 7c5123b4241d4c173f9d11e5da2c08a428aee487 Mon Sep 17 00:00:00 2001 From: laks0407 Date: Mon, 11 Nov 2024 18:27:53 -0500 Subject: [PATCH 11/17] linter --- .../src/components/common/StatusMessage.tsx | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/common/StatusMessage.tsx b/frontend/src/components/common/StatusMessage.tsx index 67f6d4e..348a3ae 100644 --- a/frontend/src/components/common/StatusMessage.tsx +++ b/frontend/src/components/common/StatusMessage.tsx @@ -6,17 +6,15 @@ interface StatusMessageProps { color?: string; } -const StatusMessage = ({ message, color = "blue.700" }: StatusMessageProps): React.ReactElement => { - return ( - - {message} - - ); - }; - - export default StatusMessage; \ No newline at end of file +const StatusMessage = ({ + message, + color = "blue.700", +}: StatusMessageProps): React.ReactElement => { + return ( + + {message} + + ); +}; + +export default StatusMessage; From c9706c6869797a0d4a102a617ef6da2ff901bba1 Mon Sep 17 00:00:00 2001 From: laks0407 Date: Tue, 12 Nov 2024 19:12:56 -0500 Subject: [PATCH 12/17] small fixes --- frontend/src/App.tsx | 3 +-- frontend/src/components/pages/ForgotPassword.tsx | 6 ++++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index d1289ce..522f9bf 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -62,11 +62,10 @@ const App = (): React.ReactElement => { - { const [userEmailId, setUserEmaild] = useState(""); const handleUserAuth = (userEmail: string) => { - const emailPattern = /^[^\s@]+@humanesociety\.org$/; + const emailPattern = + /^[^\s@]+@(humanesociety\.org|uwblueprint\.org)$/; + // added uwblueprint for test const sentEmails: SentEmail[] = JSON.parse( localStorage.getItem("sentEmails") || "[]", ); @@ -124,7 +126,7 @@ const ForgotPassword = (): React.ReactElement => { /> {!validUser && ( - Please enter a valid email. + Must be a valid humanesociety.org email )} From a83bde525a7e930b8f4bdddd5e0a0bf2f8789e92 Mon Sep 17 00:00:00 2001 From: laks0407 Date: Tue, 12 Nov 2024 19:25:34 -0500 Subject: [PATCH 13/17] linter --- frontend/src/components/pages/ForgotPassword.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/components/pages/ForgotPassword.tsx b/frontend/src/components/pages/ForgotPassword.tsx index c9266bc..cc5b82a 100644 --- a/frontend/src/components/pages/ForgotPassword.tsx +++ b/frontend/src/components/pages/ForgotPassword.tsx @@ -24,8 +24,7 @@ const ForgotPassword = (): React.ReactElement => { const [userEmailId, setUserEmaild] = useState(""); const handleUserAuth = (userEmail: string) => { - const emailPattern = - /^[^\s@]+@(humanesociety\.org|uwblueprint\.org)$/; + const emailPattern = /^[^\s@]+@(humanesociety\.org|uwblueprint\.org)$/; // added uwblueprint for test const sentEmails: SentEmail[] = JSON.parse( localStorage.getItem("sentEmails") || "[]", From 73d9911b8459e467273bfa8080776d9d4844c739 Mon Sep 17 00:00:00 2001 From: Justin Lau Date: Thu, 14 Nov 2024 18:51:15 -0500 Subject: [PATCH 14/17] Replace FormModal with AddUserFormModal and remove unused code --- .../src/components/crud/AddUserFormModal.tsx | 86 ++++++++++++++ frontend/src/components/crud/FormModal.tsx | 105 ------------------ .../components/pages/UserManagementPage.tsx | 34 +++--- 3 files changed, 101 insertions(+), 124 deletions(-) create mode 100644 frontend/src/components/crud/AddUserFormModal.tsx delete mode 100644 frontend/src/components/crud/FormModal.tsx diff --git a/frontend/src/components/crud/AddUserFormModal.tsx b/frontend/src/components/crud/AddUserFormModal.tsx new file mode 100644 index 0000000..b1afaef --- /dev/null +++ b/frontend/src/components/crud/AddUserFormModal.tsx @@ -0,0 +1,86 @@ +import React, { useState } from "react"; +import { JSONSchema7 } from "json-schema"; +import { Form } from "@rjsf/bootstrap-4"; +import SimpleEntityAPIClient, { + SimpleEntityRequest, + SimpleEntityResponse, +} from "../../APIClients/SimpleEntityAPIClient"; + +const schema: JSONSchema7 = { + title: "Create Simple Entity", + description: "A simple form to test creating a simple entity", + type: "object", + required: [ + "stringField", + "intField", + "stringArrayField", + "enumField", + "boolField", + ], + properties: { + stringField: { + type: "string", + title: "String Field", + default: "UW Blueprint", + }, + intField: { + type: "integer", + title: "Integer Field", + default: 2017, + }, + stringArrayField: { + type: "array", + items: { + type: "string", + }, + title: "String Array Field", + default: [], + }, + enumField: { + type: "string", + enum: ["A", "B", "C", "D"], + title: "Enum Field", + default: "A", + }, + boolField: { + type: "boolean", + title: "Boolean Field", + default: true, + }, + }, +}; + +const uiSchema = { + boolField: { + "ui:widget": "select", + }, +}; + +const AddUserFormModal = (): React.ReactElement => { + const [data, setData] = useState(null); + const [formFields, setFormFields] = useState( + null, + ); + + if (data) { + return

Created! ✔️

; + } + + const onSubmit = async ({ formData }: { formData: SimpleEntityRequest }) => { + const result = await SimpleEntityAPIClient.create({ formData }); + setData(result); + }; + return ( +
+ setFormFields(formData) + } + onSubmit={onSubmit} + /> + ); +}; + +export default AddUserFormModal; diff --git a/frontend/src/components/crud/FormModal.tsx b/frontend/src/components/crud/FormModal.tsx deleted file mode 100644 index c7813a3..0000000 --- a/frontend/src/components/crud/FormModal.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import React, { useState } from "react"; -import { Modal, Button, Form } from "react-bootstrap"; - -interface FormModalProps { - show: boolean; - onClose: () => void; - handleSendInvite: (formData: { - firstName: string; - lastName: string; - phoneNumber: string; - email: string; - role: string; - }) => void; -} - -const FormModal: React.FC = ({ - show, - onClose, - handleSendInvite, -}) => { - const [formData, setFormData] = useState({ - firstName: "", - lastName: "", - phoneNumber: "", - email: "", - role: "", - }); - - const handleChange = (e: React.ChangeEvent) => { - const { name, value } = e.target; - setFormData((prevData) => ({ ...prevData, [name]: value })); - }; - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - handleSendInvite(formData); - }; - - return ( - - - Send Invite - - - - - First Name - - - - Last Name - - - - Phone Number - - - - Email - - - - Role - - - - - - - ); -}; - -export default FormModal; diff --git a/frontend/src/components/pages/UserManagementPage.tsx b/frontend/src/components/pages/UserManagementPage.tsx index 8910a08..53fc43b 100644 --- a/frontend/src/components/pages/UserManagementPage.tsx +++ b/frontend/src/components/pages/UserManagementPage.tsx @@ -13,7 +13,7 @@ import { import UserAPIClient from "../../APIClients/UserAPIClient"; import { User } from "../../types/UserTypes"; import MainPageButton from "../common/MainPageButton"; -import FormModal from "../crud/FormModal"; +import AddUserFormModal from "../crud/AddUserFormModal"; const UserManagementPage = (): React.ReactElement => { const [users, setUsers] = useState([]); @@ -38,20 +38,20 @@ const UserManagementPage = (): React.ReactElement => { } }; - const closeModal = () => { - setIsModalOpen(false); - }; + // const closeModal = () => { + // setIsModalOpen(false); + // }; - const handleSendInvite = (formData: { - firstName: string; - lastName: string; - phoneNumber: string; - email: string; - role: string; - }) => { - // eslint-disable-next-line no-console - console.log(`Invite sent to ${formData.email}`); - }; + // const handleSendInvite = (formData: { + // firstName: string; + // lastName: string; + // phoneNumber: string; + // email: string; + // role: string; + // }) => { + // // eslint-disable-next-line no-console + // console.log(`Invite sent to ${formData.email}`); + // }; useEffect(() => { getUsers(); @@ -82,11 +82,7 @@ const UserManagementPage = (): React.ReactElement => { - + {isModalOpen && } From db36ca32140aa5561545073063bb09d785ac13c2 Mon Sep 17 00:00:00 2001 From: Justin Lau Date: Fri, 15 Nov 2024 01:56:28 -0500 Subject: [PATCH 15/17] Add user creation functionality and update AddUserFormModal --- frontend/src/APIClients/UserAPIClient.ts | 19 ++- .../src/components/crud/AddUserFormModal.tsx | 150 +++++++++++------- .../components/pages/UserManagementPage.tsx | 54 +++++-- frontend/src/types/UserTypes.ts | 8 +- 4 files changed, 150 insertions(+), 81 deletions(-) diff --git a/frontend/src/APIClients/UserAPIClient.ts b/frontend/src/APIClients/UserAPIClient.ts index 20ddc2e..f89524f 100644 --- a/frontend/src/APIClients/UserAPIClient.ts +++ b/frontend/src/APIClients/UserAPIClient.ts @@ -1,4 +1,4 @@ -import { User } from "../types/UserTypes"; +import { User, CreateUserDTO } from "../types/UserTypes"; import AUTHENTICATED_USER_KEY from "../constants/AuthConstants"; import baseAPIClient from "./BaseAPIClient"; import { getLocalStorageObjProperty } from "../utils/LocalStorageUtils"; @@ -18,4 +18,19 @@ const get = async (): Promise => { } }; -export default { get }; +const create = async (formData: CreateUserDTO): Promise => { + const bearerToken = `Bearer ${getLocalStorageObjProperty( + AUTHENTICATED_USER_KEY, + "accessToken", + )}`; + try { + const { data } = await baseAPIClient.post("/users", formData, { + headers: { Authorization: bearerToken }, + }); + return data; + } catch (error) { + throw new Error(`Failed to create user: ${error}`); + } +}; + +export default { get, create }; diff --git a/frontend/src/components/crud/AddUserFormModal.tsx b/frontend/src/components/crud/AddUserFormModal.tsx index b1afaef..90afcca 100644 --- a/frontend/src/components/crud/AddUserFormModal.tsx +++ b/frontend/src/components/crud/AddUserFormModal.tsx @@ -1,85 +1,113 @@ import React, { useState } from "react"; import { JSONSchema7 } from "json-schema"; import { Form } from "@rjsf/bootstrap-4"; -import SimpleEntityAPIClient, { - SimpleEntityRequest, - SimpleEntityResponse, -} from "../../APIClients/SimpleEntityAPIClient"; +import { IChangeEvent, ISubmitEvent } from "@rjsf/core"; +import { Alert, AlertIcon } from "@chakra-ui/react"; // Updated import -const schema: JSONSchema7 = { - title: "Create Simple Entity", - description: "A simple form to test creating a simple entity", +export interface AddUserRequest { + firstName: string; + lastName: string; + phoneNumber: string; + email: string; + role: "Administrator" | "Animal Behaviourist" | "Staff" | "Volunteer"; +} + +interface AddUserFormModalProps { + onSubmit: (formData: AddUserRequest) => Promise; +} + +const userSchema: JSONSchema7 = { + title: "Invite a user", + description: "Enter user details to send an invite", type: "object", - required: [ - "stringField", - "intField", - "stringArrayField", - "enumField", - "boolField", - ], + required: ["firstName", "lastName", "phoneNumber", "email", "role"], properties: { - stringField: { - type: "string", - title: "String Field", - default: "UW Blueprint", - }, - intField: { - type: "integer", - title: "Integer Field", - default: 2017, - }, - stringArrayField: { - type: "array", - items: { - type: "string", - }, - title: "String Array Field", - default: [], - }, - enumField: { + firstName: { type: "string", title: "First Name" }, + lastName: { type: "string", title: "Last Name" }, + phoneNumber: { type: "string", title: "Phone Number" }, + email: { type: "string", format: "email", title: "Email" }, + role: { type: "string", - enum: ["A", "B", "C", "D"], - title: "Enum Field", - default: "A", - }, - boolField: { - type: "boolean", - title: "Boolean Field", - default: true, + title: "Role", + enum: ["Administrator", "Animal Behaviourist", "Staff", "Volunteer"], + default: "Staff", }, }, }; const uiSchema = { - boolField: { + role: { "ui:widget": "select", }, }; -const AddUserFormModal = (): React.ReactElement => { - const [data, setData] = useState(null); - const [formFields, setFormFields] = useState( - null, - ); +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const validate = (formData: AddUserRequest, errors: any) => { + const phoneRegex = /^\d{3}-\d{3}-\d{4}$/; + const phoneRegex2 = /^\d{10}$/; + if ( + !phoneRegex.test(formData.phoneNumber) && + !phoneRegex2.test(formData.phoneNumber) + ) { + errors.phoneNumber.addError("Phone number must be in xxx-xxx-xxxx format."); + } + if (!formData.email.includes("@")) { + errors.email.addError("Email must be in address@domain format."); + } + return errors; +}; + +const AddUserFormModal = ({ + onSubmit, +}: AddUserFormModalProps): React.ReactElement => { + const [data, setData] = useState(null); + const [formFields, setFormFields] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const handleSubmit = async ({ formData }: ISubmitEvent) => { + setLoading(true); + setError(null); + try { + await onSubmit(formData); + setData(formData); + setFormFields(null); + } catch (err) { + setError("An error occurred while sending the invite."); + } finally { + setLoading(false); + } + }; if (data) { - return

Created! ✔️

; + return ( + + + Invite Sent! ✔️ + + ); } - const onSubmit = async ({ formData }: { formData: SimpleEntityRequest }) => { - const result = await SimpleEntityAPIClient.create({ formData }); - setData(result); - }; return ( -
- setFormFields(formData) - } - onSubmit={onSubmit} - /> +
+ ) => + setFormFields(formData) + } + onSubmit={handleSubmit} + > +
+ +
+ + {error &&

{error}

} +
); }; diff --git a/frontend/src/components/pages/UserManagementPage.tsx b/frontend/src/components/pages/UserManagementPage.tsx index 53fc43b..44c097e 100644 --- a/frontend/src/components/pages/UserManagementPage.tsx +++ b/frontend/src/components/pages/UserManagementPage.tsx @@ -13,7 +13,21 @@ import { import UserAPIClient from "../../APIClients/UserAPIClient"; import { User } from "../../types/UserTypes"; import MainPageButton from "../common/MainPageButton"; -import AddUserFormModal from "../crud/AddUserFormModal"; +import AddUserFormModal, { AddUserRequest } from "../crud/AddUserFormModal"; + +const handleUserSubmit = async (formData: AddUserRequest) => { + await UserAPIClient.create({ + firstName: formData.firstName, + lastName: formData.lastName, + phoneNumber: formData.phoneNumber, + email: formData.email, + role: formData.role as + | "Administrator" + | "Animal Behaviourist" + | "Staff" + | "Volunteer", + }); +}; const UserManagementPage = (): React.ReactElement => { const [users, setUsers] = useState([]); @@ -26,7 +40,7 @@ const UserManagementPage = (): React.ReactElement => { setUsers(fetchedUsers); } } catch (error) { - /* TODO: error handling */ + throw new Error(`Failed to get users: ${error}`); } }; @@ -34,24 +48,17 @@ const UserManagementPage = (): React.ReactElement => { try { setIsModalOpen(true); } catch (error) { - /* TODO: error handling */ + throw new Error(`Failed to add user: ${error}`); } }; - // const closeModal = () => { - // setIsModalOpen(false); - // }; + const closeModal = () => { + setIsModalOpen(false); + }; - // const handleSendInvite = (formData: { - // firstName: string; - // lastName: string; - // phoneNumber: string; - // email: string; - // role: string; - // }) => { - // // eslint-disable-next-line no-console - // console.log(`Invite sent to ${formData.email}`); - // }; + const refreshUserManagementTable = async () => { + await getUsers(); + }; useEffect(() => { getUsers(); @@ -76,13 +83,26 @@ const UserManagementPage = (): React.ReactElement => { {user.firstName} {user.lastName} {user.role} + {user.status} ))} - {isModalOpen && } + {isModalOpen && ( + { + const completeFormData: AddUserRequest = { + ...formData, + }; + return handleUserSubmit(completeFormData).then(() => { + closeModal(); + refreshUserManagementTable(); + }); + }} + /> + )} diff --git a/frontend/src/types/UserTypes.ts b/frontend/src/types/UserTypes.ts index ec548db..9e1e780 100644 --- a/frontend/src/types/UserTypes.ts +++ b/frontend/src/types/UserTypes.ts @@ -3,6 +3,12 @@ export type User = { firstName: string; lastName: string; email: string; - role: string; + role: "Administrator" | "Animal Behaviourist" | "Staff" | "Volunteer"; status: string; + skillLevel?: number | null; + canSeeAllLogs?: boolean | null; + canAssignUsersToTasks?: boolean | null; + phoneNumber?: string | null; }; + +export type CreateUserDTO = Omit; From 74e59819ab9386437fd98cbbaf99f8686a9b317f Mon Sep 17 00:00:00 2001 From: Justin Lau Date: Fri, 15 Nov 2024 02:19:02 -0500 Subject: [PATCH 16/17] add error and success messages --- .../src/components/crud/AddUserFormModal.tsx | 12 --- .../components/pages/UserManagementPage.tsx | 97 ++++++++++++++----- 2 files changed, 73 insertions(+), 36 deletions(-) diff --git a/frontend/src/components/crud/AddUserFormModal.tsx b/frontend/src/components/crud/AddUserFormModal.tsx index 90afcca..d0a57a0 100644 --- a/frontend/src/components/crud/AddUserFormModal.tsx +++ b/frontend/src/components/crud/AddUserFormModal.tsx @@ -2,7 +2,6 @@ import React, { useState } from "react"; import { JSONSchema7 } from "json-schema"; import { Form } from "@rjsf/bootstrap-4"; import { IChangeEvent, ISubmitEvent } from "@rjsf/core"; -import { Alert, AlertIcon } from "@chakra-ui/react"; // Updated import export interface AddUserRequest { firstName: string; @@ -60,7 +59,6 @@ const validate = (formData: AddUserRequest, errors: any) => { const AddUserFormModal = ({ onSubmit, }: AddUserFormModalProps): React.ReactElement => { - const [data, setData] = useState(null); const [formFields, setFormFields] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -70,7 +68,6 @@ const AddUserFormModal = ({ setError(null); try { await onSubmit(formData); - setData(formData); setFormFields(null); } catch (err) { setError("An error occurred while sending the invite."); @@ -79,15 +76,6 @@ const AddUserFormModal = ({ } }; - if (data) { - return ( - - - Invite Sent! ✔️ - - ); - } - return (
{ - await UserAPIClient.create({ - firstName: formData.firstName, - lastName: formData.lastName, - phoneNumber: formData.phoneNumber, - email: formData.email, - role: formData.role as - | "Administrator" - | "Animal Behaviourist" - | "Staff" - | "Volunteer", - }); + // eslint-disable-next-line no-useless-catch + try { + await UserAPIClient.create({ + firstName: formData.firstName, + lastName: formData.lastName, + phoneNumber: formData.phoneNumber, + email: formData.email, + role: formData.role as + | "Administrator" + | "Animal Behaviourist" + | "Staff" + | "Volunteer", + }); + } catch (error) { + throw error; + } }; const UserManagementPage = (): React.ReactElement => { const [users, setUsers] = useState([]); const [isModalOpen, setIsModalOpen] = useState(false); + const [successMessage, setSuccessMessage] = useState(null); + const [errorMessage, setErrorMessage] = useState(null); const getUsers = async () => { try { @@ -40,16 +50,12 @@ const UserManagementPage = (): React.ReactElement => { setUsers(fetchedUsers); } } catch (error) { - throw new Error(`Failed to get users: ${error}`); + setErrorMessage(`Failed to get users: ${error}`); } }; - const addUser = async () => { - try { - setIsModalOpen(true); - } catch (error) { - throw new Error(`Failed to add user: ${error}`); - } + const addUser = () => { + setIsModalOpen(true); }; const closeModal = () => { @@ -68,13 +74,39 @@ const UserManagementPage = (): React.ReactElement => {

User Management

+ {successMessage && ( + + + {successMessage} + setSuccessMessage(null)} + /> + + )} + {errorMessage && ( + + + {errorMessage} + setErrorMessage(null)} + /> + + )} + + @@ -82,6 +114,7 @@ const UserManagementPage = (): React.ReactElement => { + @@ -92,14 +125,30 @@ const UserManagementPage = (): React.ReactElement => { {isModalOpen && ( { - const completeFormData: AddUserRequest = { - ...formData, - }; - return handleUserSubmit(completeFormData).then(() => { + onSubmit={async (formData) => { + // Clear previous messages + setSuccessMessage(null); + setErrorMessage(null); + try { + await handleUserSubmit(formData); + setSuccessMessage("Invite Sent! ✔️"); closeModal(); refreshUserManagementTable(); - }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + // Customize error message based on backend response + if ( + error.response && + error.response.data && + error.response.data.message + ) { + setErrorMessage(error.response.data.message); + } else { + setErrorMessage( + "An error occurred while sending the invite.", + ); + } + } }} /> )} From 660829f91694a319cd7fe6b6afe1d185545daf31 Mon Sep 17 00:00:00 2001 From: vips11 <66628544+vips11@users.noreply.github.com> Date: Fri, 22 Nov 2024 13:22:34 -0800 Subject: [PATCH 17/17] fixed level constraints --- ...07.create-behaviour-level-details-table.ts | 4 --- ...29T20.20.02.create-user-behaviour-table.ts | 14 ++++++--- ....29T20.29.50.add-pet-behaviour-columns.ts} | 26 ++++++++++------- ...onstraint-behaviour-level-details-table.ts | 19 ++++++++++++ .../typescript/models/petBehaviour.model.ts | 5 +--- backend/typescript/models/petBehaviour.ts | 29 ------------------- 6 files changed, 45 insertions(+), 52 deletions(-) rename backend/typescript/migrations/{2024.10.29T20.29.50.add-user-behaviour-columns copy.ts => 2024.10.29T20.29.50.add-pet-behaviour-columns.ts} (61%) create mode 100644 backend/typescript/migrations/2024.11.21T16.49.50.add-constraint-behaviour-level-details-table.ts delete mode 100644 backend/typescript/models/petBehaviour.ts diff --git a/backend/typescript/migrations/2024.10.22T19.38.07.create-behaviour-level-details-table.ts b/backend/typescript/migrations/2024.10.22T19.38.07.create-behaviour-level-details-table.ts index 59f3180..868e19f 100644 --- a/backend/typescript/migrations/2024.10.22T19.38.07.create-behaviour-level-details-table.ts +++ b/backend/typescript/migrations/2024.10.22T19.38.07.create-behaviour-level-details-table.ts @@ -23,10 +23,6 @@ export const up: Migration = async ({ context: sequelize }) => { }, level: { type: DataType.INTEGER, - validate: { - min: 1, - max: 4, - }, allowNull: false, }, description: { diff --git a/backend/typescript/migrations/2024.10.29T20.20.02.create-user-behaviour-table.ts b/backend/typescript/migrations/2024.10.29T20.20.02.create-user-behaviour-table.ts index d440e2d..da04cc5 100644 --- a/backend/typescript/migrations/2024.10.29T20.20.02.create-user-behaviour-table.ts +++ b/backend/typescript/migrations/2024.10.29T20.20.02.create-user-behaviour-table.ts @@ -5,6 +5,7 @@ import { MAX_BEHAVIOUR_LEVEL, MIN_BEHAVIOUR_LEVEL } from "../constants"; const TABLE_NAME = "user_behaviours"; const CONSTRAINT_NAME = "unique_user_behaviour_skill"; +const CONSTRAINT_NAME_2 = "max_level_interval"; export const up: Migration = async ({ context: sequelize }) => { await sequelize.getQueryInterface().createTable(TABLE_NAME, { @@ -32,10 +33,6 @@ export const up: Migration = async ({ context: sequelize }) => { }, max_level: { type: DataType.INTEGER, - validate: { - min: MIN_BEHAVIOUR_LEVEL, - max: MAX_BEHAVIOUR_LEVEL, - }, allowNull: false, }, }); @@ -45,6 +42,11 @@ export const up: Migration = async ({ context: sequelize }) => { type: "unique", name: CONSTRAINT_NAME, }); + + await sequelize.query( + `ALTER TABLE ${TABLE_NAME} ADD CONSTRAINT ${CONSTRAINT_NAME_2} + CHECK (max_level BETWEEN ${MIN_BEHAVIOUR_LEVEL} AND ${MAX_BEHAVIOUR_LEVEL});`, + ); }; export const down: Migration = async ({ context: sequelize }) => { @@ -52,5 +54,9 @@ export const down: Migration = async ({ context: sequelize }) => { .getQueryInterface() .removeConstraint(TABLE_NAME, CONSTRAINT_NAME); + await sequelize.query( + `ALTER TABLE ${TABLE_NAME} DROP CONSTRAINT ${CONSTRAINT_NAME_2};`, + ); + await sequelize.getQueryInterface().dropTable(TABLE_NAME); }; diff --git a/backend/typescript/migrations/2024.10.29T20.29.50.add-user-behaviour-columns copy.ts b/backend/typescript/migrations/2024.10.29T20.29.50.add-pet-behaviour-columns.ts similarity index 61% rename from backend/typescript/migrations/2024.10.29T20.29.50.add-user-behaviour-columns copy.ts rename to backend/typescript/migrations/2024.10.29T20.29.50.add-pet-behaviour-columns.ts index 16c86fa..c8ec3bc 100644 --- a/backend/typescript/migrations/2024.10.29T20.29.50.add-user-behaviour-columns copy.ts +++ b/backend/typescript/migrations/2024.10.29T20.29.50.add-pet-behaviour-columns.ts @@ -4,20 +4,13 @@ import { MAX_BEHAVIOUR_LEVEL, MIN_BEHAVIOUR_LEVEL } from "../constants"; const TABLE_NAME = "pet_behaviours"; const CONSTRAINT_NAME = "unique_pet_behaviour"; +const CONSTRAINT_NAME_2 = "skill_level_interval"; export const up: Migration = async ({ context: sequelize }) => { - await sequelize.getQueryInterface().addColumn(TABLE_NAME, "level", { - type: DataType.INTEGER, - allowNull: false, - validate: { - min: MIN_BEHAVIOUR_LEVEL, - max: MAX_BEHAVIOUR_LEVEL, - }, - }); - await sequelize.getQueryInterface().addColumn(TABLE_NAME, "is_highlighted", { type: DataType.BOOLEAN, - allowNull: false, + allowNull: true, + defaultValue: false, }); await sequelize.getQueryInterface().addConstraint(TABLE_NAME, { @@ -25,12 +18,23 @@ export const up: Migration = async ({ context: sequelize }) => { type: "unique", name: CONSTRAINT_NAME, }); + + await sequelize.query( + `ALTER TABLE ${TABLE_NAME} ADD CONSTRAINT ${CONSTRAINT_NAME_2} + CHECK (skill_level BETWEEN ${MIN_BEHAVIOUR_LEVEL} AND ${MAX_BEHAVIOUR_LEVEL});`, + ); }; export const down: Migration = async ({ context: sequelize }) => { - await sequelize.getQueryInterface().removeColumn(TABLE_NAME, "level"); + await sequelize + .getQueryInterface() + .removeConstraint(TABLE_NAME, CONSTRAINT_NAME); await sequelize .getQueryInterface() .removeColumn(TABLE_NAME, "is_highlighted"); + + await sequelize.query( + `ALTER TABLE ${TABLE_NAME} DROP CONSTRAINT ${CONSTRAINT_NAME_2};`, + ); }; diff --git a/backend/typescript/migrations/2024.11.21T16.49.50.add-constraint-behaviour-level-details-table.ts b/backend/typescript/migrations/2024.11.21T16.49.50.add-constraint-behaviour-level-details-table.ts new file mode 100644 index 0000000..b93ad21 --- /dev/null +++ b/backend/typescript/migrations/2024.11.21T16.49.50.add-constraint-behaviour-level-details-table.ts @@ -0,0 +1,19 @@ +import { DataType } from "sequelize-typescript"; +import { Migration } from "../umzug"; +import { MAX_BEHAVIOUR_LEVEL, MIN_BEHAVIOUR_LEVEL } from "../constants"; + +const TABLE_NAME = "behaviour_level_details"; +const CONSTRAINT_NAME = "level_interval"; + +export const up: Migration = async ({ context: sequelize }) => { + await sequelize.query( + `ALTER TABLE ${TABLE_NAME} ADD CONSTRAINT ${CONSTRAINT_NAME} + CHECK (level BETWEEN ${MIN_BEHAVIOUR_LEVEL} AND ${MAX_BEHAVIOUR_LEVEL});`, + ); +}; + +export const down: Migration = async ({ context: sequelize }) => { + await sequelize.query( + `ALTER TABLE ${TABLE_NAME} DROP CONSTRAINT ${CONSTRAINT_NAME};`, + ); +}; diff --git a/backend/typescript/models/petBehaviour.model.ts b/backend/typescript/models/petBehaviour.model.ts index 1e677b7..04479d9 100644 --- a/backend/typescript/models/petBehaviour.model.ts +++ b/backend/typescript/models/petBehaviour.model.ts @@ -28,9 +28,6 @@ export default class PetBehaviour extends Model { @Column({ type: DataType.INTEGER, allowNull: false }) skill_level!: number; - @Column({ type: DataType.INTEGER, allowNull: false }) - level!: number; - - @Column({ type: DataType.BOOLEAN, allowNull: false }) + @Column({ type: DataType.BOOLEAN, allowNull: true }) is_highlighted!: boolean; } diff --git a/backend/typescript/models/petBehaviour.ts b/backend/typescript/models/petBehaviour.ts deleted file mode 100644 index 524e0d3..0000000 --- a/backend/typescript/models/petBehaviour.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { - Column, - Model, - Table, - ForeignKey, - BelongsTo, -} from "sequelize-typescript"; -import Behaviour from "./behaviour.model"; -import Pet from "./pet.model"; - -@Table({ timestamps: false, tableName: "pet_behaviours" }) -export default class PetBehaviour extends Model { - @ForeignKey(() => Pet) - @Column({}) - pet_id!: number; - - @BelongsTo(() => Pet) - pet!: Pet; - - @ForeignKey(() => Behaviour) - @Column({}) - behaviour_id!: number; - - @BelongsTo(() => Behaviour) - behaviour!: Behaviour; - - @Column({}) - skill_level!: number; -}
First Name Last NameEmail RoleStatus
{user.firstName} {user.lastName}{user.email} {user.role} {user.status}