diff --git a/src/index.ts b/src/index.ts index d4d4e03a90526f68b863acfb68616cf0268762d4..39b7a6ce455ec083a2e0f35ceb0c1d609ee5b056 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,7 @@ import bodyParser from "body-parser"; import expressSession from "express-session"; import authRoute from "./routes/auth"; import newsRoute from "./routes/news"; +import usersRoute from "./routes/user"; mongoose .connect("mongodb://localhost:27017/bodysch", { @@ -46,6 +47,10 @@ authRoute(app); // Register routes newsRoute(app); +usersRoute(app); + + + app.use((err: any, req: Request, res: Response, next: NextFunction) => { res.status(500).send("Houston, we have a problem!"); diff --git a/src/middlewares/auth/complete.ts b/src/middlewares/auth/complete.ts index 2f51c83720611deeaed408fdcf3c4abd7f1a7d74..988565680015af76bfebe882c9012ea1c9a9b6d3 100644 --- a/src/middlewares/auth/complete.ts +++ b/src/middlewares/auth/complete.ts @@ -15,7 +15,7 @@ const complete = () => async (req: Request, res: Response) => { await axios.get(`https://auth.sch.bme.hu/api/profile/?access_token=${token.access_token}`) .then( (response) => { req.session!.user = { - id: String(response.data.basic), + id: String(response.data.internal_id), email: String(response.data.mail), name: `${response.data.sn} ${response.data.givenName}` , token, diff --git a/src/middlewares/user/addUser.ts b/src/middlewares/user/addUser.ts new file mode 100644 index 0000000000000000000000000000000000000000..af47ce6e30550e456d1b0db66100258cdc929114 --- /dev/null +++ b/src/middlewares/user/addUser.ts @@ -0,0 +1,29 @@ +import { Request, Response, NextFunction } from 'express'; +import Profile, { Role } from "../../models/ProfileSchema"; + +const addUser = () => (req: Request, res: Response, next: NextFunction) => { + const profile = new Profile(); + + const fields = ['studentCardNumber', 'roomNumber', 'picture']; + fields.forEach(field => { + const value = req.body[field] + if(value) + profile.set(field, value); + }); + + profile.external_id = req.session!.user!.id; + profile.role = Role.User; + + profile.save(err => { + if (err) { + res.status(400); + } + else { + res.status(201); + res.data = {profile}; + } + next() + }); +} + +export default addUser; \ No newline at end of file diff --git a/src/middlewares/user/addWarning.ts b/src/middlewares/user/addWarning.ts new file mode 100644 index 0000000000000000000000000000000000000000..e7eae54ef0692fb641e551038535e48883ac95e7 --- /dev/null +++ b/src/middlewares/user/addWarning.ts @@ -0,0 +1,7 @@ +import {Request, Response, NextFunction} from 'express'; + +const addWarning = () => (req: Request, res: Response, next: NextFunction) =>{ + res.send("Add warning"); +} + +export default addWarning; \ No newline at end of file diff --git a/src/middlewares/user/deleteUser.ts b/src/middlewares/user/deleteUser.ts new file mode 100644 index 0000000000000000000000000000000000000000..fe4eb181a4e0424b637227bf5cb8d5f67cfcd187 --- /dev/null +++ b/src/middlewares/user/deleteUser.ts @@ -0,0 +1,15 @@ +import { Request, Response, NextFunction } from 'express'; +import Profile from '../../models/ProfileSchema'; + +const deletUser = () => (req: Request, res: Response, next: NextFunction) => { + Profile.findByIdAndDelete(req.params.id, (error) => { + if (error) { + res.status(400); + } else { + res.status(204); + } + next(); + }); +} + +export default deletUser; \ No newline at end of file diff --git a/src/middlewares/user/deleteWarning.ts b/src/middlewares/user/deleteWarning.ts new file mode 100644 index 0000000000000000000000000000000000000000..90ca8a2d9344ee0907f7de52b071f2e9f3341a73 --- /dev/null +++ b/src/middlewares/user/deleteWarning.ts @@ -0,0 +1,7 @@ +import {Request, Response, NextFunction} from 'express'; + +const deleteWarning = () => (req: Request, res: Response, next: NextFunction) =>{ + res.send("Delete warning"); +} + +export default deleteWarning; \ No newline at end of file diff --git a/src/middlewares/user/getUser.ts b/src/middlewares/user/getUser.ts new file mode 100644 index 0000000000000000000000000000000000000000..0f165ef4f5276bf5ba84b0f1cfb1cef2f4f63d34 --- /dev/null +++ b/src/middlewares/user/getUser.ts @@ -0,0 +1,17 @@ +import { Request, Response, NextFunction } from 'express'; +import Profile from '../../models/ProfileSchema'; + +const getUser = () => (req: Request, res: Response, next: NextFunction) => { + Profile.findById(req.params.id, (error, profile) => { + if (error) { + console.warn(error); + res.status(400); + } else { + res.status(200); + res.data = { profile }; + } + next(); + }); +} + +export default getUser; \ No newline at end of file diff --git a/src/middlewares/user/getUsersList.ts b/src/middlewares/user/getUsersList.ts new file mode 100644 index 0000000000000000000000000000000000000000..5cd7a515512c99f6ba85587244de281666250d39 --- /dev/null +++ b/src/middlewares/user/getUsersList.ts @@ -0,0 +1,17 @@ +import {Request, Response, NextFunction} from 'express'; +import Profile from '../../models/ProfileSchema'; + +const getUsersList = () => (req: Request, res: Response, next: NextFunction) =>{ + Profile.find({}, (err, profiles) =>{ + if(err) { + res.status(400); + } + else{ + res.status(200); + res.data = {profiles} + } + next(); + }) +} + +export default getUsersList; \ No newline at end of file diff --git a/src/middlewares/user/getWarning.ts b/src/middlewares/user/getWarning.ts new file mode 100644 index 0000000000000000000000000000000000000000..d97d5d2523185bd35c6f3210608d79dfcd2faea5 --- /dev/null +++ b/src/middlewares/user/getWarning.ts @@ -0,0 +1,7 @@ +import {Request, Response, NextFunction} from 'express'; + +const getWarning = () => (req: Request, res: Response, next: NextFunction) =>{ + res.send("Get warning"); +} + +export default getWarning; \ No newline at end of file diff --git a/src/middlewares/user/getWarningsList.ts b/src/middlewares/user/getWarningsList.ts new file mode 100644 index 0000000000000000000000000000000000000000..c4cff031cc1d7cb1f3e435812a766f96cb296a4c --- /dev/null +++ b/src/middlewares/user/getWarningsList.ts @@ -0,0 +1,7 @@ +import {Request, Response, NextFunction} from 'express'; + +const getWarningsList = () => (req: Request, res: Response, next: NextFunction) =>{ + res.send("Get warnings"); +} + +export default getWarningsList; \ No newline at end of file diff --git a/src/middlewares/user/responseUser.ts b/src/middlewares/user/responseUser.ts new file mode 100644 index 0000000000000000000000000000000000000000..07d6958cbdeade91bea4ae0d8a24ba6b9f6dafb1 --- /dev/null +++ b/src/middlewares/user/responseUser.ts @@ -0,0 +1,7 @@ +import { Request, Response, NextFunction, response } from 'express'; + +const responseUser = () => (req: Request, res: Response) => { + res.json(res.data.profile); +} + +export default responseUser; \ No newline at end of file diff --git a/src/middlewares/user/responseUserList.ts b/src/middlewares/user/responseUserList.ts new file mode 100644 index 0000000000000000000000000000000000000000..364b3c490615cf41d242baa211dd95cac0bde51a --- /dev/null +++ b/src/middlewares/user/responseUserList.ts @@ -0,0 +1,7 @@ +import { Request, Response, NextFunction, response } from 'express'; + +const responseUserList = () => (req: Request, res: Response) => { + res.json(res.data.profiles); +} + +export default responseUserList; \ No newline at end of file diff --git a/src/middlewares/user/updateUser.ts b/src/middlewares/user/updateUser.ts new file mode 100644 index 0000000000000000000000000000000000000000..2097af527aff8f1f91a540563ebb766caccc9abe --- /dev/null +++ b/src/middlewares/user/updateUser.ts @@ -0,0 +1,29 @@ +import {Request, Response, NextFunction} from 'express'; +import Profile from '../../models/ProfileSchema'; + +const updateUser = () => (req: Request, res: Response, next: NextFunction) => { + const validFields = ['studentCardNumber', 'roomNumber', 'picture']; + Profile.findOne( + {_id : req.params.id}, + (error, profile) => { + res.status(200); + if (error) { + res.status(400); + } + else { + if(profile){ + validFields.forEach(field => { + const value = req.body[field] + if(value) + profile.set(field, value); + }); + profile.save(); + res.data = {profile}; + } + } + next(); + } + ); +} + +export default updateUser; \ No newline at end of file diff --git a/src/middlewares/user/updateWarning.ts b/src/middlewares/user/updateWarning.ts new file mode 100644 index 0000000000000000000000000000000000000000..6ff3f0bed90016310472a41c0505e4a729278cc4 --- /dev/null +++ b/src/middlewares/user/updateWarning.ts @@ -0,0 +1,7 @@ +import {Request, Response, NextFunction} from 'express'; + +const updateWarning = () => (req: Request, res: Response, next: NextFunction) =>{ + res.send("Update warning"); +} + +export default updateWarning; \ No newline at end of file diff --git a/src/middlewares/utils/emptyResponse.ts b/src/middlewares/utils/emptyResponse.ts new file mode 100644 index 0000000000000000000000000000000000000000..60be09bb11e956e78c3db4ca2f3b886574b25535 --- /dev/null +++ b/src/middlewares/utils/emptyResponse.ts @@ -0,0 +1,5 @@ +import { Request, Response } from 'express'; + + + +const emptyResponse = () => (req: Request, res: Response) => res.json({}); \ No newline at end of file diff --git a/src/models/ProfileSchema.ts b/src/models/ProfileSchema.ts new file mode 100644 index 0000000000000000000000000000000000000000..9e1aef52b979bcae7d57a32e30a625d0c1fb1ac0 --- /dev/null +++ b/src/models/ProfileSchema.ts @@ -0,0 +1,31 @@ +import { Document, Schema, model } from 'mongoose'; +import { IWarnings, WarningSchema } from './WarningSchema'; +import { Admin } from 'mongodb'; + +export enum Role { + Admin, + Staff, + User, +} + +export interface IProfile extends Document { + external_id: string, + studentCardNumber: string, + roomNumber?: string, + picture: string, + role: Role.Admin | Role.Staff | Role.User, + email?: string, + name?: string, + warnings: [IWarnings] | [], +}; + +const ProfileSchema = new Schema({ + external_id: {type: String, required: true, unique : true, dropDups: true }, + studentCardNumber: {type: String, required: true }, + roomNumber: {type: String}, + picture: {type: String}, + role: {type: String, required: true}, + warnings: [WarningSchema] +}); + +export default model<IProfile>('Profile', ProfileSchema); \ No newline at end of file diff --git a/src/models/WarningSchema.ts b/src/models/WarningSchema.ts new file mode 100644 index 0000000000000000000000000000000000000000..8eec29a2ef19a109417338ebd7147f5a376094de --- /dev/null +++ b/src/models/WarningSchema.ts @@ -0,0 +1,19 @@ +import { Schema } from 'mongoose'; + +export interface IWarnings extends Document{ + text: string, + date: Date, + given_by: { + _id: string, + name: string, + } +} + +export const WarningSchema = new Schema({ + text: {type: String, required: true}, + date: {type: Date, required: true}, + given_by: {required: true, type: { + _id: {type: String, required: true}, + name: {String, required: true}, + }} +}); diff --git a/src/routes/user.ts b/src/routes/user.ts new file mode 100644 index 0000000000000000000000000000000000000000..cb39dd4dc86d6b16ec0c0cd11250047bb530511e --- /dev/null +++ b/src/routes/user.ts @@ -0,0 +1,41 @@ +import { Application } from 'express'; +import addWarning from "../middlewares/user/addWarning"; +import deleteUser from "../middlewares/user/deleteUser"; +import deleteWarning from "../middlewares/user/deleteWarning"; +import getUser from "../middlewares/user/getUser"; +import getUsersList from "../middlewares/user/getUsersList"; +import getWarning from "../middlewares/user/getWarning"; +import getWarningsList from "../middlewares/user/getWarningsList"; +import updateUser from "../middlewares/user/updateUser"; +import updateWarning from "../middlewares/user/updateWarning"; +import addUser from '../middlewares/user/addUser'; +import authenticated from '../middlewares/auth/authenticated'; +import emptyResponse from 'src/middlewares/utils/emptyResponse'; +import responseUser from 'src/middlewares/user/responseUser'; +import responseUserList from 'src/middlewares/user/responseUserList'; + + + + const usersRoute = (app: Application): void => { + app.get('/users', authenticated(), getUsersList(), responseUserList()); + + app.post('/users', authenticated(), addUser(), responseUser()); + + app.get('/users/:id', getUser(), responseUser() ); + + app.get('/users/:id/warnings', getWarningsList() ); + + app.get('/users/:userId/warnings/:warningId', getWarning() ); + + app.post('/users/:id/warnings', addWarning()); + + app.put('/users/:id', updateUser(), responseUser() ); + + app.put('/users/:userId/warnings/:warningId', updateWarning()); + + app.delete('/users/:id', deleteUser(), emptyResponse()); + + app.delete('/users/:userId/warnings/:warningId', deleteWarning()); +} + +export default usersRoute; \ No newline at end of file diff --git a/src/utils/declarations/response.d.ts b/src/utils/declarations/response.d.ts index fb2d7ee4b3aaea8c4fd741748c86631e764b969f..6d004f4f33ad3c529a7d21f4f28281439024e601 100644 --- a/src/utils/declarations/response.d.ts +++ b/src/utils/declarations/response.d.ts @@ -1,4 +1,5 @@ import { INews } from "../../models/NewsSchema"; +import { IProfile } from "src/models/ProfileSchema"; declare global { namespace Express { @@ -6,6 +7,8 @@ declare global { data: { news?: INews[] | null; newsObject?: INews | null; + profile?: IProfile | null; + profiles?: IProfile[] | null; }; } }