From a192e93754b278cf4f7d5596b8f8d2c5487883e2 Mon Sep 17 00:00:00 2001 From: Mansur Date: Mon, 7 Nov 2022 08:12:00 +0100 Subject: [PATCH 1/9] update models relationships --- api/server/relationshipTester.js | 0 api/server/src/models/assignment.js | 7 +++++++ api/server/src/models/assignmentscore.js | 5 ++++- api/server/src/models/class.js | 3 +++ api/server/src/models/classstudent.js | 1 + api/server/src/models/classteacher.js | 3 ++- api/server/src/models/message.js | 2 ++ api/server/src/models/notice.js | 2 ++ api/server/src/models/role.js | 1 + api/server/src/models/user.js | 6 ++++++ 10 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 api/server/relationshipTester.js diff --git a/api/server/relationshipTester.js b/api/server/relationshipTester.js new file mode 100644 index 0000000..e69de29 diff --git a/api/server/src/models/assignment.js b/api/server/src/models/assignment.js index 68e8363..ed997fa 100644 --- a/api/server/src/models/assignment.js +++ b/api/server/src/models/assignment.js @@ -11,6 +11,9 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Assignment.belongsTo(models.User, {foreignKey: 'teacherId', as: 'teacher'}); + Assignment.belongsTo(models.User, {foreignKey: 'studentId', as: 'student'}); + Assignment.belongsTo(models.Class, {foreignKey: 'classId', as: 'class'}); } } Assignment.init({ @@ -26,6 +29,10 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.UUID, allowNull:false }, + teacherId:{ + type: DataTypes.UUID, + allowNull:false + }, studentId:{ type: DataTypes.UUID, allowNull:false diff --git a/api/server/src/models/assignmentscore.js b/api/server/src/models/assignmentscore.js index 32c0eb4..be142c0 100644 --- a/api/server/src/models/assignmentscore.js +++ b/api/server/src/models/assignmentscore.js @@ -11,6 +11,9 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + AssignmentScore.belongsTo(models.Assignment, {foreignKey:'assignmentId', as: 'assignment'}); + AssignmentScore.belongsTo(models.User, {foreignKey: 'studentId', as: 'student'}); + AssignmentScore.belongsTo(models.User, {foreignKey: 'teacherId', as: 'teacher'}); } } AssignmentScore.init({ @@ -30,7 +33,7 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.UUID, allowNull:false }, - teacher: { + teacherId: { type: DataTypes.UUID, allowNull:false } diff --git a/api/server/src/models/class.js b/api/server/src/models/class.js index 650b6a0..1b83082 100644 --- a/api/server/src/models/class.js +++ b/api/server/src/models/class.js @@ -11,6 +11,9 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Class.hasMany(models.ClassStudent, {as: 'student'}); + Class.hasMany(models.User, {as: 'teacher'}); + } } Class.init({ diff --git a/api/server/src/models/classstudent.js b/api/server/src/models/classstudent.js index c0c1b24..f5df2a1 100644 --- a/api/server/src/models/classstudent.js +++ b/api/server/src/models/classstudent.js @@ -11,6 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Class.belongsTo(models.Class, {foreignKey: 'classId', as: 'class'}); } } ClassStudent.init({ diff --git a/api/server/src/models/classteacher.js b/api/server/src/models/classteacher.js index f1df259..c2fe1e0 100644 --- a/api/server/src/models/classteacher.js +++ b/api/server/src/models/classteacher.js @@ -10,7 +10,8 @@ module.exports = (sequelize, DataTypes) => { * The `models/index` file will call this method automatically. */ static associate(models) { - // define association here + Class.belongsTo(models.Class, {foreignKey: 'classId', as: 'class'}); + Class.belongsTo(models.User, {foreignKey: 'teacherId', as: 'teacher'}); } } ClassTeacher.init({ diff --git a/api/server/src/models/message.js b/api/server/src/models/message.js index 2a46837..44636b3 100644 --- a/api/server/src/models/message.js +++ b/api/server/src/models/message.js @@ -11,6 +11,8 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Class.belongsTo(models.User, {foreignKey: 'sender', as: 'sender'}); + Class.belongsTo(models.User, {foreignKey: 'receiver', as: 'receiver'}); } } Message.init({ diff --git a/api/server/src/models/notice.js b/api/server/src/models/notice.js index c257ce7..d37bd6a 100644 --- a/api/server/src/models/notice.js +++ b/api/server/src/models/notice.js @@ -11,6 +11,8 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Notice.belongsTo(models.Class, {foreignKey: 'classId', as: 'class'}); + Notice.belongsTo(models.User, {foreignKey: 'teacherId', as: 'user'}); } } Notice.init({ diff --git a/api/server/src/models/role.js b/api/server/src/models/role.js index 5b10281..6ffc329 100644 --- a/api/server/src/models/role.js +++ b/api/server/src/models/role.js @@ -11,6 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + Role.hasMany(models.User, {as: 'user'}); } } Role.init({ diff --git a/api/server/src/models/user.js b/api/server/src/models/user.js index 13d57f6..24bb980 100644 --- a/api/server/src/models/user.js +++ b/api/server/src/models/user.js @@ -2,6 +2,7 @@ const { Model } = require('sequelize'); +const assignment = require('./assignment'); module.exports = (sequelize, DataTypes) => { class User extends Model { /** @@ -11,6 +12,11 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + User.hasMany(models.Assignment, {foreignKey: 'assignmentId', as: 'assignment'}) + User.hasMany(models.AssignmentScore, {foreignKey: 'assignmentScoreId', as: 'assignmentScore'}) + User.belongsTo(models.Message, {foreignKey: 'sender', as: 'sender'}); + User.belongsTo(models.Message, {foreignKey: 'receiver', as: 'receiver'}); + User.belongsTo(models.Role, {foreignKey: 'roleId', as: 'role'}) } } User.init({ From 144be6e94551f64a0ec0a2960cf61a98e22a94bc Mon Sep 17 00:00:00 2001 From: Mansur Date: Mon, 7 Nov 2022 08:17:02 +0100 Subject: [PATCH 2/9] re-add test class --- api/index.js | 25 +++++++++++++++++++++++++ api/test/test.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 api/index.js create mode 100644 api/test/test.js diff --git a/api/index.js b/api/index.js new file mode 100644 index 0000000..ad19a00 --- /dev/null +++ b/api/index.js @@ -0,0 +1,25 @@ +import config from 'dotenv'; +import express from 'express'; +config.config(); + +const app = express(); + +// when a random route is inputed +// app.get('*', (req, res) => res.status(200).send({ +// message: 'Welcome to this API.', +// })); + +app.get('/', (req, res)=>{ + res.send({ + message: 'Welcome to this API.', + }) +}) + +const port = process.env.PORT || 8000; +app.listen(process.env.port || port, ()=>{ + console.log(`Server started at port ${port}`); +}) + + + +export default app; diff --git a/api/test/test.js b/api/test/test.js new file mode 100644 index 0000000..8d52ec3 --- /dev/null +++ b/api/test/test.js @@ -0,0 +1,28 @@ +require ('chai').should() +import chai from 'chai'; +import chaiHttp from 'chai-http'; +//import './chai/register-should'; +import app from '../index'; + +chai.use(chaiHttp); +const { expect } = chai; + +describe('Testing the class-manager endpoints:', () => { + + + it('It should get a welcome message at the root endpoint', (done) => { + const bookId = 1; + chai.request(app) + .get("/") + .set('Accept', 'application/json') + .then((res) => { + expect(res.status).to.equal(200); + expect(res.body.data.message).to.include("Welcome to this API.") + }) + .catch((err) => { + console.log(err); + }); + done(); + }); + +}); \ No newline at end of file From af32b21247e41cf6ce7cf07002190eadf24bd6ea Mon Sep 17 00:00:00 2001 From: Mansur Date: Mon, 7 Nov 2022 08:19:32 +0100 Subject: [PATCH 3/9] move api folder into src folder --- {api => src/api}/index.js | 0 {api => src/api}/server/relationshipTester.js | 0 {api => src/api}/server/src/config/config.js | 0 .../api}/server/src/migrations/20221030092330-create-user.js | 0 .../api}/server/src/migrations/20221030101534-create-notice.js | 0 .../src/migrations/20221030101627-create-assignment-score.js | 0 .../server/src/migrations/20221030101644-create-assignment.js | 0 .../api}/server/src/migrations/20221030101723-create-message.js | 0 .../api}/server/src/migrations/20221030101744-create-role.js | 0 .../server/src/migrations/20221030101838-create-class-teacher.js | 0 .../api}/server/src/migrations/20221030101917-create-class.js | 0 .../server/src/migrations/20221030102005-create-class-student.js | 0 {api => src/api}/server/src/models/assignment.js | 0 {api => src/api}/server/src/models/assignmentscore.js | 0 {api => src/api}/server/src/models/class.js | 0 {api => src/api}/server/src/models/classstudent.js | 0 {api => src/api}/server/src/models/classteacher.js | 0 {api => src/api}/server/src/models/index.js | 0 {api => src/api}/server/src/models/message.js | 0 {api => src/api}/server/src/models/notice.js | 0 {api => src/api}/server/src/models/role.js | 0 {api => src/api}/server/src/models/user.js | 0 {api => src/api}/test/test.js | 0 23 files changed, 0 insertions(+), 0 deletions(-) rename {api => src/api}/index.js (100%) rename {api => src/api}/server/relationshipTester.js (100%) rename {api => src/api}/server/src/config/config.js (100%) rename {api => src/api}/server/src/migrations/20221030092330-create-user.js (100%) rename {api => src/api}/server/src/migrations/20221030101534-create-notice.js (100%) rename {api => src/api}/server/src/migrations/20221030101627-create-assignment-score.js (100%) rename {api => src/api}/server/src/migrations/20221030101644-create-assignment.js (100%) rename {api => src/api}/server/src/migrations/20221030101723-create-message.js (100%) rename {api => src/api}/server/src/migrations/20221030101744-create-role.js (100%) rename {api => src/api}/server/src/migrations/20221030101838-create-class-teacher.js (100%) rename {api => src/api}/server/src/migrations/20221030101917-create-class.js (100%) rename {api => src/api}/server/src/migrations/20221030102005-create-class-student.js (100%) rename {api => src/api}/server/src/models/assignment.js (100%) rename {api => src/api}/server/src/models/assignmentscore.js (100%) rename {api => src/api}/server/src/models/class.js (100%) rename {api => src/api}/server/src/models/classstudent.js (100%) rename {api => src/api}/server/src/models/classteacher.js (100%) rename {api => src/api}/server/src/models/index.js (100%) rename {api => src/api}/server/src/models/message.js (100%) rename {api => src/api}/server/src/models/notice.js (100%) rename {api => src/api}/server/src/models/role.js (100%) rename {api => src/api}/server/src/models/user.js (100%) rename {api => src/api}/test/test.js (100%) diff --git a/api/index.js b/src/api/index.js similarity index 100% rename from api/index.js rename to src/api/index.js diff --git a/api/server/relationshipTester.js b/src/api/server/relationshipTester.js similarity index 100% rename from api/server/relationshipTester.js rename to src/api/server/relationshipTester.js diff --git a/api/server/src/config/config.js b/src/api/server/src/config/config.js similarity index 100% rename from api/server/src/config/config.js rename to src/api/server/src/config/config.js diff --git a/api/server/src/migrations/20221030092330-create-user.js b/src/api/server/src/migrations/20221030092330-create-user.js similarity index 100% rename from api/server/src/migrations/20221030092330-create-user.js rename to src/api/server/src/migrations/20221030092330-create-user.js diff --git a/api/server/src/migrations/20221030101534-create-notice.js b/src/api/server/src/migrations/20221030101534-create-notice.js similarity index 100% rename from api/server/src/migrations/20221030101534-create-notice.js rename to src/api/server/src/migrations/20221030101534-create-notice.js diff --git a/api/server/src/migrations/20221030101627-create-assignment-score.js b/src/api/server/src/migrations/20221030101627-create-assignment-score.js similarity index 100% rename from api/server/src/migrations/20221030101627-create-assignment-score.js rename to src/api/server/src/migrations/20221030101627-create-assignment-score.js diff --git a/api/server/src/migrations/20221030101644-create-assignment.js b/src/api/server/src/migrations/20221030101644-create-assignment.js similarity index 100% rename from api/server/src/migrations/20221030101644-create-assignment.js rename to src/api/server/src/migrations/20221030101644-create-assignment.js diff --git a/api/server/src/migrations/20221030101723-create-message.js b/src/api/server/src/migrations/20221030101723-create-message.js similarity index 100% rename from api/server/src/migrations/20221030101723-create-message.js rename to src/api/server/src/migrations/20221030101723-create-message.js diff --git a/api/server/src/migrations/20221030101744-create-role.js b/src/api/server/src/migrations/20221030101744-create-role.js similarity index 100% rename from api/server/src/migrations/20221030101744-create-role.js rename to src/api/server/src/migrations/20221030101744-create-role.js diff --git a/api/server/src/migrations/20221030101838-create-class-teacher.js b/src/api/server/src/migrations/20221030101838-create-class-teacher.js similarity index 100% rename from api/server/src/migrations/20221030101838-create-class-teacher.js rename to src/api/server/src/migrations/20221030101838-create-class-teacher.js diff --git a/api/server/src/migrations/20221030101917-create-class.js b/src/api/server/src/migrations/20221030101917-create-class.js similarity index 100% rename from api/server/src/migrations/20221030101917-create-class.js rename to src/api/server/src/migrations/20221030101917-create-class.js diff --git a/api/server/src/migrations/20221030102005-create-class-student.js b/src/api/server/src/migrations/20221030102005-create-class-student.js similarity index 100% rename from api/server/src/migrations/20221030102005-create-class-student.js rename to src/api/server/src/migrations/20221030102005-create-class-student.js diff --git a/api/server/src/models/assignment.js b/src/api/server/src/models/assignment.js similarity index 100% rename from api/server/src/models/assignment.js rename to src/api/server/src/models/assignment.js diff --git a/api/server/src/models/assignmentscore.js b/src/api/server/src/models/assignmentscore.js similarity index 100% rename from api/server/src/models/assignmentscore.js rename to src/api/server/src/models/assignmentscore.js diff --git a/api/server/src/models/class.js b/src/api/server/src/models/class.js similarity index 100% rename from api/server/src/models/class.js rename to src/api/server/src/models/class.js diff --git a/api/server/src/models/classstudent.js b/src/api/server/src/models/classstudent.js similarity index 100% rename from api/server/src/models/classstudent.js rename to src/api/server/src/models/classstudent.js diff --git a/api/server/src/models/classteacher.js b/src/api/server/src/models/classteacher.js similarity index 100% rename from api/server/src/models/classteacher.js rename to src/api/server/src/models/classteacher.js diff --git a/api/server/src/models/index.js b/src/api/server/src/models/index.js similarity index 100% rename from api/server/src/models/index.js rename to src/api/server/src/models/index.js diff --git a/api/server/src/models/message.js b/src/api/server/src/models/message.js similarity index 100% rename from api/server/src/models/message.js rename to src/api/server/src/models/message.js diff --git a/api/server/src/models/notice.js b/src/api/server/src/models/notice.js similarity index 100% rename from api/server/src/models/notice.js rename to src/api/server/src/models/notice.js diff --git a/api/server/src/models/role.js b/src/api/server/src/models/role.js similarity index 100% rename from api/server/src/models/role.js rename to src/api/server/src/models/role.js diff --git a/api/server/src/models/user.js b/src/api/server/src/models/user.js similarity index 100% rename from api/server/src/models/user.js rename to src/api/server/src/models/user.js diff --git a/api/test/test.js b/src/api/test/test.js similarity index 100% rename from api/test/test.js rename to src/api/test/test.js From e1587ba88ca97dc5b46ddd7f21387d3d83994405 Mon Sep 17 00:00:00 2001 From: Mansur Date: Mon, 7 Nov 2022 08:23:09 +0100 Subject: [PATCH 4/9] change sequelize directory --- .sequelizerc | 8 ++++---- src/api/server/{src => db}/config/config.js | 0 .../{src => db}/migrations/20221030092330-create-user.js | 0 .../migrations/20221030101534-create-notice.js | 0 .../migrations/20221030101627-create-assignment-score.js | 0 .../migrations/20221030101644-create-assignment.js | 0 .../migrations/20221030101723-create-message.js | 0 .../{src => db}/migrations/20221030101744-create-role.js | 0 .../migrations/20221030101838-create-class-teacher.js | 0 .../{src => db}/migrations/20221030101917-create-class.js | 0 .../migrations/20221030102005-create-class-student.js | 0 src/api/server/{src => db}/models/assignment.js | 0 src/api/server/{src => db}/models/assignmentscore.js | 0 src/api/server/{src => db}/models/class.js | 0 src/api/server/{src => db}/models/classstudent.js | 0 src/api/server/{src => db}/models/classteacher.js | 0 src/api/server/{src => db}/models/index.js | 0 src/api/server/{src => db}/models/message.js | 0 src/api/server/{src => db}/models/notice.js | 0 src/api/server/{src => db}/models/role.js | 0 src/api/server/{src => db}/models/user.js | 0 21 files changed, 4 insertions(+), 4 deletions(-) rename src/api/server/{src => db}/config/config.js (100%) rename src/api/server/{src => db}/migrations/20221030092330-create-user.js (100%) rename src/api/server/{src => db}/migrations/20221030101534-create-notice.js (100%) rename src/api/server/{src => db}/migrations/20221030101627-create-assignment-score.js (100%) rename src/api/server/{src => db}/migrations/20221030101644-create-assignment.js (100%) rename src/api/server/{src => db}/migrations/20221030101723-create-message.js (100%) rename src/api/server/{src => db}/migrations/20221030101744-create-role.js (100%) rename src/api/server/{src => db}/migrations/20221030101838-create-class-teacher.js (100%) rename src/api/server/{src => db}/migrations/20221030101917-create-class.js (100%) rename src/api/server/{src => db}/migrations/20221030102005-create-class-student.js (100%) rename src/api/server/{src => db}/models/assignment.js (100%) rename src/api/server/{src => db}/models/assignmentscore.js (100%) rename src/api/server/{src => db}/models/class.js (100%) rename src/api/server/{src => db}/models/classstudent.js (100%) rename src/api/server/{src => db}/models/classteacher.js (100%) rename src/api/server/{src => db}/models/index.js (100%) rename src/api/server/{src => db}/models/message.js (100%) rename src/api/server/{src => db}/models/notice.js (100%) rename src/api/server/{src => db}/models/role.js (100%) rename src/api/server/{src => db}/models/user.js (100%) diff --git a/.sequelizerc b/.sequelizerc index a0cbee3..a166c99 100644 --- a/.sequelizerc +++ b/.sequelizerc @@ -1,7 +1,7 @@ const path = require('path') module.exports = { - "config": path.resolve('./api/server/src/config', 'config.js'), - "models-path": path.resolve('./api/server/src/models'), - "seeders-path": path.resolve('./api/server/src/seeders'), - "migrations-path": path.resolve('./api/server/src/migrations') + "config": path.resolve('./src/api/server/db/config', 'config.js'), + "models-path": path.resolve('./src/api/server/db/models'), + "seeders-path": path.resolve('./src/api/server/db/seeders'), + "migrations-path": path.resolve('./src/api/server/db/migrations') }; \ No newline at end of file diff --git a/src/api/server/src/config/config.js b/src/api/server/db/config/config.js similarity index 100% rename from src/api/server/src/config/config.js rename to src/api/server/db/config/config.js diff --git a/src/api/server/src/migrations/20221030092330-create-user.js b/src/api/server/db/migrations/20221030092330-create-user.js similarity index 100% rename from src/api/server/src/migrations/20221030092330-create-user.js rename to src/api/server/db/migrations/20221030092330-create-user.js diff --git a/src/api/server/src/migrations/20221030101534-create-notice.js b/src/api/server/db/migrations/20221030101534-create-notice.js similarity index 100% rename from src/api/server/src/migrations/20221030101534-create-notice.js rename to src/api/server/db/migrations/20221030101534-create-notice.js diff --git a/src/api/server/src/migrations/20221030101627-create-assignment-score.js b/src/api/server/db/migrations/20221030101627-create-assignment-score.js similarity index 100% rename from src/api/server/src/migrations/20221030101627-create-assignment-score.js rename to src/api/server/db/migrations/20221030101627-create-assignment-score.js diff --git a/src/api/server/src/migrations/20221030101644-create-assignment.js b/src/api/server/db/migrations/20221030101644-create-assignment.js similarity index 100% rename from src/api/server/src/migrations/20221030101644-create-assignment.js rename to src/api/server/db/migrations/20221030101644-create-assignment.js diff --git a/src/api/server/src/migrations/20221030101723-create-message.js b/src/api/server/db/migrations/20221030101723-create-message.js similarity index 100% rename from src/api/server/src/migrations/20221030101723-create-message.js rename to src/api/server/db/migrations/20221030101723-create-message.js diff --git a/src/api/server/src/migrations/20221030101744-create-role.js b/src/api/server/db/migrations/20221030101744-create-role.js similarity index 100% rename from src/api/server/src/migrations/20221030101744-create-role.js rename to src/api/server/db/migrations/20221030101744-create-role.js diff --git a/src/api/server/src/migrations/20221030101838-create-class-teacher.js b/src/api/server/db/migrations/20221030101838-create-class-teacher.js similarity index 100% rename from src/api/server/src/migrations/20221030101838-create-class-teacher.js rename to src/api/server/db/migrations/20221030101838-create-class-teacher.js diff --git a/src/api/server/src/migrations/20221030101917-create-class.js b/src/api/server/db/migrations/20221030101917-create-class.js similarity index 100% rename from src/api/server/src/migrations/20221030101917-create-class.js rename to src/api/server/db/migrations/20221030101917-create-class.js diff --git a/src/api/server/src/migrations/20221030102005-create-class-student.js b/src/api/server/db/migrations/20221030102005-create-class-student.js similarity index 100% rename from src/api/server/src/migrations/20221030102005-create-class-student.js rename to src/api/server/db/migrations/20221030102005-create-class-student.js diff --git a/src/api/server/src/models/assignment.js b/src/api/server/db/models/assignment.js similarity index 100% rename from src/api/server/src/models/assignment.js rename to src/api/server/db/models/assignment.js diff --git a/src/api/server/src/models/assignmentscore.js b/src/api/server/db/models/assignmentscore.js similarity index 100% rename from src/api/server/src/models/assignmentscore.js rename to src/api/server/db/models/assignmentscore.js diff --git a/src/api/server/src/models/class.js b/src/api/server/db/models/class.js similarity index 100% rename from src/api/server/src/models/class.js rename to src/api/server/db/models/class.js diff --git a/src/api/server/src/models/classstudent.js b/src/api/server/db/models/classstudent.js similarity index 100% rename from src/api/server/src/models/classstudent.js rename to src/api/server/db/models/classstudent.js diff --git a/src/api/server/src/models/classteacher.js b/src/api/server/db/models/classteacher.js similarity index 100% rename from src/api/server/src/models/classteacher.js rename to src/api/server/db/models/classteacher.js diff --git a/src/api/server/src/models/index.js b/src/api/server/db/models/index.js similarity index 100% rename from src/api/server/src/models/index.js rename to src/api/server/db/models/index.js diff --git a/src/api/server/src/models/message.js b/src/api/server/db/models/message.js similarity index 100% rename from src/api/server/src/models/message.js rename to src/api/server/db/models/message.js diff --git a/src/api/server/src/models/notice.js b/src/api/server/db/models/notice.js similarity index 100% rename from src/api/server/src/models/notice.js rename to src/api/server/db/models/notice.js diff --git a/src/api/server/src/models/role.js b/src/api/server/db/models/role.js similarity index 100% rename from src/api/server/src/models/role.js rename to src/api/server/db/models/role.js diff --git a/src/api/server/src/models/user.js b/src/api/server/db/models/user.js similarity index 100% rename from src/api/server/src/models/user.js rename to src/api/server/db/models/user.js From 7539d975862665a3b9939624c5cb6c6d7ca8a179 Mon Sep 17 00:00:00 2001 From: Mansur Date: Mon, 7 Nov 2022 08:37:22 +0100 Subject: [PATCH 5/9] move api folder into src folder --- .sequelizerc | 8 ++++---- package.json | 2 +- src/api/{server => }/db/config/config.js | 0 .../db/migrations/20221030092330-create-user.js | 0 .../db/migrations/20221030101534-create-notice.js | 0 .../migrations/20221030101627-create-assignment-score.js | 0 .../db/migrations/20221030101644-create-assignment.js | 0 .../db/migrations/20221030101723-create-message.js | 0 .../db/migrations/20221030101744-create-role.js | 0 .../db/migrations/20221030101838-create-class-teacher.js | 0 .../db/migrations/20221030101917-create-class.js | 0 .../db/migrations/20221030102005-create-class-student.js | 0 src/api/{server => }/db/models/assignment.js | 0 src/api/{server => }/db/models/assignmentscore.js | 0 src/api/{server => }/db/models/class.js | 0 src/api/{server => }/db/models/classstudent.js | 0 src/api/{server => }/db/models/classteacher.js | 0 src/api/{server => }/db/models/index.js | 0 src/api/{server => }/db/models/message.js | 0 src/api/{server => }/db/models/notice.js | 0 src/api/{server => }/db/models/role.js | 0 src/api/{server => }/db/models/user.js | 0 src/api/{server => }/relationshipTester.js | 0 23 files changed, 5 insertions(+), 5 deletions(-) rename src/api/{server => }/db/config/config.js (100%) rename src/api/{server => }/db/migrations/20221030092330-create-user.js (100%) rename src/api/{server => }/db/migrations/20221030101534-create-notice.js (100%) rename src/api/{server => }/db/migrations/20221030101627-create-assignment-score.js (100%) rename src/api/{server => }/db/migrations/20221030101644-create-assignment.js (100%) rename src/api/{server => }/db/migrations/20221030101723-create-message.js (100%) rename src/api/{server => }/db/migrations/20221030101744-create-role.js (100%) rename src/api/{server => }/db/migrations/20221030101838-create-class-teacher.js (100%) rename src/api/{server => }/db/migrations/20221030101917-create-class.js (100%) rename src/api/{server => }/db/migrations/20221030102005-create-class-student.js (100%) rename src/api/{server => }/db/models/assignment.js (100%) rename src/api/{server => }/db/models/assignmentscore.js (100%) rename src/api/{server => }/db/models/class.js (100%) rename src/api/{server => }/db/models/classstudent.js (100%) rename src/api/{server => }/db/models/classteacher.js (100%) rename src/api/{server => }/db/models/index.js (100%) rename src/api/{server => }/db/models/message.js (100%) rename src/api/{server => }/db/models/notice.js (100%) rename src/api/{server => }/db/models/role.js (100%) rename src/api/{server => }/db/models/user.js (100%) rename src/api/{server => }/relationshipTester.js (100%) diff --git a/.sequelizerc b/.sequelizerc index a166c99..17f0e84 100644 --- a/.sequelizerc +++ b/.sequelizerc @@ -1,7 +1,7 @@ const path = require('path') module.exports = { - "config": path.resolve('./src/api/server/db/config', 'config.js'), - "models-path": path.resolve('./src/api/server/db/models'), - "seeders-path": path.resolve('./src/api/server/db/seeders'), - "migrations-path": path.resolve('./src/api/server/db/migrations') + "config": path.resolve('./src/api/db/config', 'config.js'), + "models-path": path.resolve('./src/api/db/models'), + "seeders-path": path.resolve('./src/api/db/seeders'), + "migrations-path": path.resolve('./src/api/db/migrations') }; \ No newline at end of file diff --git a/package.json b/package.json index 02ef3f7..139d680 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "lint": "eslint --ext .js .", "lint:check": "eslint .", "lint:fix": "eslint --fix .", - "test": "set NODE_ENV=test sequelize db:migrate:undo:all sequelize db:migrate && nyc --require @babel/register mocha ./api/test/test.js --timeout 20000 --exit", + "test": "set NODE_ENV=test sequelize db:migrate:undo:all sequelize db:migrate && nyc --require @babel/register mocha ./src/api/test/test.js --timeout 20000 --exit", "generate-lcov": "nyc report --reporter=text-lcov > lcov.info", "coveralls-coverage": "coveralls < lcov.info", "codeclimate-coverage": "codeclimate-test-reporter < lcov.info", diff --git a/src/api/server/db/config/config.js b/src/api/db/config/config.js similarity index 100% rename from src/api/server/db/config/config.js rename to src/api/db/config/config.js diff --git a/src/api/server/db/migrations/20221030092330-create-user.js b/src/api/db/migrations/20221030092330-create-user.js similarity index 100% rename from src/api/server/db/migrations/20221030092330-create-user.js rename to src/api/db/migrations/20221030092330-create-user.js diff --git a/src/api/server/db/migrations/20221030101534-create-notice.js b/src/api/db/migrations/20221030101534-create-notice.js similarity index 100% rename from src/api/server/db/migrations/20221030101534-create-notice.js rename to src/api/db/migrations/20221030101534-create-notice.js diff --git a/src/api/server/db/migrations/20221030101627-create-assignment-score.js b/src/api/db/migrations/20221030101627-create-assignment-score.js similarity index 100% rename from src/api/server/db/migrations/20221030101627-create-assignment-score.js rename to src/api/db/migrations/20221030101627-create-assignment-score.js diff --git a/src/api/server/db/migrations/20221030101644-create-assignment.js b/src/api/db/migrations/20221030101644-create-assignment.js similarity index 100% rename from src/api/server/db/migrations/20221030101644-create-assignment.js rename to src/api/db/migrations/20221030101644-create-assignment.js diff --git a/src/api/server/db/migrations/20221030101723-create-message.js b/src/api/db/migrations/20221030101723-create-message.js similarity index 100% rename from src/api/server/db/migrations/20221030101723-create-message.js rename to src/api/db/migrations/20221030101723-create-message.js diff --git a/src/api/server/db/migrations/20221030101744-create-role.js b/src/api/db/migrations/20221030101744-create-role.js similarity index 100% rename from src/api/server/db/migrations/20221030101744-create-role.js rename to src/api/db/migrations/20221030101744-create-role.js diff --git a/src/api/server/db/migrations/20221030101838-create-class-teacher.js b/src/api/db/migrations/20221030101838-create-class-teacher.js similarity index 100% rename from src/api/server/db/migrations/20221030101838-create-class-teacher.js rename to src/api/db/migrations/20221030101838-create-class-teacher.js diff --git a/src/api/server/db/migrations/20221030101917-create-class.js b/src/api/db/migrations/20221030101917-create-class.js similarity index 100% rename from src/api/server/db/migrations/20221030101917-create-class.js rename to src/api/db/migrations/20221030101917-create-class.js diff --git a/src/api/server/db/migrations/20221030102005-create-class-student.js b/src/api/db/migrations/20221030102005-create-class-student.js similarity index 100% rename from src/api/server/db/migrations/20221030102005-create-class-student.js rename to src/api/db/migrations/20221030102005-create-class-student.js diff --git a/src/api/server/db/models/assignment.js b/src/api/db/models/assignment.js similarity index 100% rename from src/api/server/db/models/assignment.js rename to src/api/db/models/assignment.js diff --git a/src/api/server/db/models/assignmentscore.js b/src/api/db/models/assignmentscore.js similarity index 100% rename from src/api/server/db/models/assignmentscore.js rename to src/api/db/models/assignmentscore.js diff --git a/src/api/server/db/models/class.js b/src/api/db/models/class.js similarity index 100% rename from src/api/server/db/models/class.js rename to src/api/db/models/class.js diff --git a/src/api/server/db/models/classstudent.js b/src/api/db/models/classstudent.js similarity index 100% rename from src/api/server/db/models/classstudent.js rename to src/api/db/models/classstudent.js diff --git a/src/api/server/db/models/classteacher.js b/src/api/db/models/classteacher.js similarity index 100% rename from src/api/server/db/models/classteacher.js rename to src/api/db/models/classteacher.js diff --git a/src/api/server/db/models/index.js b/src/api/db/models/index.js similarity index 100% rename from src/api/server/db/models/index.js rename to src/api/db/models/index.js diff --git a/src/api/server/db/models/message.js b/src/api/db/models/message.js similarity index 100% rename from src/api/server/db/models/message.js rename to src/api/db/models/message.js diff --git a/src/api/server/db/models/notice.js b/src/api/db/models/notice.js similarity index 100% rename from src/api/server/db/models/notice.js rename to src/api/db/models/notice.js diff --git a/src/api/server/db/models/role.js b/src/api/db/models/role.js similarity index 100% rename from src/api/server/db/models/role.js rename to src/api/db/models/role.js diff --git a/src/api/server/db/models/user.js b/src/api/db/models/user.js similarity index 100% rename from src/api/server/db/models/user.js rename to src/api/db/models/user.js diff --git a/src/api/server/relationshipTester.js b/src/api/relationshipTester.js similarity index 100% rename from src/api/server/relationshipTester.js rename to src/api/relationshipTester.js From 20ba5a29997074cdf60d89735e08603b3d73a178 Mon Sep 17 00:00:00 2001 From: Mansur Date: Mon, 7 Nov 2022 13:25:28 +0100 Subject: [PATCH 6/9] create message CRUD --- src/api/controllers/MessageController.js | 106 +++++++++++++++++++++++ src/api/db/config/config.js | 12 +-- src/api/routers/MessageRouter.js | 12 +++ src/api/services/MessageService.js | 68 +++++++++++++++ src/api/test/chaa.js | 3 + src/api/test/test.js | 5 +- src/index.js | 9 ++ 7 files changed, 207 insertions(+), 8 deletions(-) create mode 100644 src/api/controllers/MessageController.js create mode 100644 src/api/routers/MessageRouter.js create mode 100644 src/api/services/MessageService.js create mode 100644 src/api/test/chaa.js diff --git a/src/api/controllers/MessageController.js b/src/api/controllers/MessageController.js new file mode 100644 index 0000000..a815e9c --- /dev/null +++ b/src/api/controllers/MessageController.js @@ -0,0 +1,106 @@ +import MessageService from '../services/MessageService.js'; +import Util from '../utils/Utils.js'; + +const util = new Util(); + +class MessageController { + static async getAllMessages(req, res) { + try { + const allMessages = await MessageService.getAllMessages(); + if (allMessages.length > 0) { + util.setSuccess(200, 'Messages retrieved', allMessages); + } else { + util.setSuccess(200, 'No Message found'); + } + return util.send(res); + } catch (error) { + util.setError(400, error); + return util.send(res); + } + } + + static async addMessage(req, res) { + if (!req.body.title || !req.body.price || !req.body.description) { + util.setError(400, 'Please provide complete details'); + return util.send(res); + } + const newMessage = req.body; + try { + const createdMessage = await MessageService.addMessage(newMessage); + util.setSuccess(201, 'Message Added!', createdMessage); + return util.send(res); + } catch (error) { + util.setError(400, error.message); + return util.send(res); + } + } + + static async updatedMessage(req, res) { + const alteredMessage = req.body; + const { id } = req.params; + if (!Number(id)) { + util.setError(400, 'Please input a valid numeric value'); + return util.send(res); + } + try { + const updateMessage = await MessageService.updateMessage(id, alteredMessage); + if (!updateMessage) { + util.setError(404, `Cannot find Message with the id: ${id}`); + } else { + util.setSuccess(200, 'Message updated', updateMessage); + } + return util.send(res); + } catch (error) { + util.setError(404, error); + return util.send(res); + } + } + + static async getAMessage(req, res) { + const { id } = req.params; + + if (!Number(id)) { + util.setError(400, 'Please input a valid numeric value'); + return util.send(res); + } + + try { + const theMessage = await MessageService.getAMessage(id); + + if (!theMessage) { + util.setError(404, `Cannot find Message with the id ${id}`); + } else { + util.setSuccess(200, 'Found Message', theMessage); + } + return util.send(res); + } catch (error) { + util.setError(404, error); + return util.send(res); + } + } + + static async deleteMessage(req, res) { + const { id } = req.params; + + if (!Number(id)) { + util.setError(400, 'Please provide a numeric value'); + return util.send(res); + } + + try { + const MessageToDelete = await MessageService.deleteMessage(id); + + if (MessageToDelete) { + util.setSuccess(200, 'Message deleted'); + } else { + util.setError(404, `Message with the id ${id} cannot be found`); + } + return util.send(res); + } catch (error) { + util.setError(400, error); + return util.send(res); + } + } +} + +export default MessageController; \ No newline at end of file diff --git a/src/api/db/config/config.js b/src/api/db/config/config.js index f92dc29..d755927 100644 --- a/src/api/db/config/config.js +++ b/src/api/db/config/config.js @@ -1,22 +1,22 @@ module.exports = { "development": { - "username": "root", - "password": null, - "database": "database_development", - "host": "127.0.0.1", + "username": "tgsowrsnnwphjg", + "password": da09381ea24589af12153a9aca04de1d9283245434520ba084ccc6b55065520d, + "database": "d3a0e6i6blrn6p", + "host": "ec2-3-227-68-43.compute-1.amazonaws.com", "dialect": "mysql" }, "test": { "username": "root", "password": null, - "database": "database_test", + "database": "classManager_test", "host": "127.0.0.1", "dialect": "mysql" }, "production": { "username": "root", "password": null, - "database": "database_production", + "database": "classManager_production", "host": "127.0.0.1", "dialect": "mysql" } diff --git a/src/api/routers/MessageRouter.js b/src/api/routers/MessageRouter.js new file mode 100644 index 0000000..e4faaed --- /dev/null +++ b/src/api/routers/MessageRouter.js @@ -0,0 +1,12 @@ +import { Router } from 'express'; +import MessageController from '../controllers/MessageController.js'; + +const messageRouter = Router(); + +router.get('/', MessageController.getAllMessages); +router.post('/', MessageController.addMessage); +router.get('/:id', MessageController.getAMessage); +router.put('/:id', MessageController.updatedMessage); +router.delete('/:id', MessageController.deleteMessage); + +export default messageRouter; \ No newline at end of file diff --git a/src/api/services/MessageService.js b/src/api/services/MessageService.js new file mode 100644 index 0000000..9ad970c --- /dev/null +++ b/src/api/services/MessageService.js @@ -0,0 +1,68 @@ +import database from '../db/models'; + +class MessageService { + static async getAllMessages() { + try { + const result = await database.Message.findAll(); + return result; + } catch (error) { + throw error; + } + } + + static async addMessage(newMessage) { + try { + const result = await database.Message.create(newMessage); + return result; + } catch (error) { + throw error; + } + } + + static async updateMessage(id, updateMessage) { + try { + const messageToUpdate = await database.Message.findOne({ + where: { id: Number(id) } + }); + + if (messageToUpdate) { + await database.Message.update(updateMessage, { where: { id: Number(id) } }); + + return updateMessage; + } + return null; + } catch (error) { + throw error; + } + } + + static async getAMessage(id) { + try { + const aMessage = await database.Message.findOne({ + where: { id: Number(id) } + }); + + return aMessage; + } catch (error) { + throw error; + } + } + + static async deleteMessage(id) { + try { + const messageToDelete = await database.Message.findOne({ where: { id: Number(id) } }); + + if (messageToDelete) { + const deletedMessage = await database.Message.destroy({ + where: { id: Number(id) } + }); + return deletedMessage; + } + return null; + } catch (error) { + throw error; + } + } +} + +export default MessageService; diff --git a/src/api/test/chaa.js b/src/api/test/chaa.js new file mode 100644 index 0000000..682e0df --- /dev/null +++ b/src/api/test/chaa.js @@ -0,0 +1,3 @@ +//require ('chai').should() +import chai from 'chai'; +chai.should(); diff --git a/src/api/test/test.js b/src/api/test/test.js index 8d52ec3..c876db2 100644 --- a/src/api/test/test.js +++ b/src/api/test/test.js @@ -1,8 +1,9 @@ -require ('chai').should() +//require ('chai').should() +import './chaa.js'; import chai from 'chai'; import chaiHttp from 'chai-http'; //import './chai/register-should'; -import app from '../index'; +import app from '../../index.js'; chai.use(chaiHttp); const { expect } = chai; diff --git a/src/index.js b/src/index.js index b86534a..4b6fe5f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,6 @@ import express from "express"; import dotenv from "dotenv"; +import messageRouter from "./api/routers/MessageRouter.js"; const app = express(); dotenv.config(); @@ -7,6 +8,14 @@ dotenv.config(); // Middlewares app.use(express.json()); app.use(express.urlencoded()); +app.use('/api', messageRouter); + +app +app.get('/', (req, res)=>{ + res.send({ + message: 'Welcome to this API.', + }) +}) app.get("/ping", (_req, res) => { res.status(200); From 29f07a7f7756c94cc931fda8459b9383e65519a4 Mon Sep 17 00:00:00 2001 From: Mansur Date: Tue, 8 Nov 2022 11:32:00 +0100 Subject: [PATCH 7/9] handle utilities --- package.json | 2 +- src/api/controllers/MessageController.js | 2 +- src/api/db/config/config.js | 35 +++++++++++------- .../20221030101723-create-message.js | 10 +++++ src/api/db/models/assignment.js | 14 ++++--- src/api/db/models/assignmentscore.js | 14 ++++--- src/api/db/models/class.js | 5 ++- src/api/db/models/classstudent.js | 12 ++++-- src/api/db/models/classteacher.js | 13 ++++--- src/api/db/models/index.js | 2 +- src/api/db/models/message.js | 17 +++++---- src/api/db/models/notice.js | 9 +++-- src/api/db/models/role.js | 3 +- src/api/db/models/user.js | 7 ++-- src/api/routers/MessageRouter.js | 10 ++--- src/api/services/MessageService.js | 2 +- src/api/utils/Utils.js | 37 +++++++++++++++++++ 17 files changed, 137 insertions(+), 57 deletions(-) create mode 100644 src/api/utils/Utils.js diff --git a/package.json b/package.json index 139d680..65bcdf8 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "description": "", "main": "./src/server.js", - "type": "module", + "scripts": { "start": "nodemon --exec babel-node ./src/server.js", "watch:dev": "nodemon ./src/server.js", diff --git a/src/api/controllers/MessageController.js b/src/api/controllers/MessageController.js index a815e9c..79d9bd1 100644 --- a/src/api/controllers/MessageController.js +++ b/src/api/controllers/MessageController.js @@ -20,7 +20,7 @@ class MessageController { } static async addMessage(req, res) { - if (!req.body.title || !req.body.price || !req.body.description) { + if (!req.body.message || !req.body.senderId || !req.body.receiverId) { util.setError(400, 'Please provide complete details'); return util.send(res); } diff --git a/src/api/db/config/config.js b/src/api/db/config/config.js index d755927..e826292 100644 --- a/src/api/db/config/config.js +++ b/src/api/db/config/config.js @@ -1,23 +1,32 @@ + module.exports = { - "development": { + development: { + database: 'classManager', + username: 'postgres', + password: "123456789", + host: '127.0.0.1', + dialect: 'postgres' + }, + local: { "username": "tgsowrsnnwphjg", - "password": da09381ea24589af12153a9aca04de1d9283245434520ba084ccc6b55065520d, + "password": "da09381ea24589af12153a9aca04de1d9283245434520ba084ccc6b55065520d", "database": "d3a0e6i6blrn6p", - "host": "ec2-3-227-68-43.compute-1.amazonaws.com", - "dialect": "mysql" + "host": "https://ec2-3-227-68-43.compute-1.amazonaws.com", + "dialect": "postgres" }, - "test": { + test: { "username": "root", "password": null, "database": "classManager_test", "host": "127.0.0.1", - "dialect": "mysql" + "dialect": "postgres" }, - "production": { - "username": "root", - "password": null, - "database": "classManager_production", - "host": "127.0.0.1", - "dialect": "mysql" + production: { + "username": "tgsowrsnnwphjg", + "password": "da09381ea24589af12153a9aca04de1d9283245434520ba084ccc6b55065520d", + "database": "d3a0e6i6blrn6p", + "host": "ec2-3-227-68-43.compute-1.amazonaws.com", + "dialect": "postgres" } -} +}; +//export default config; diff --git a/src/api/db/migrations/20221030101723-create-message.js b/src/api/db/migrations/20221030101723-create-message.js index b9f6d27..aa8ccb1 100644 --- a/src/api/db/migrations/20221030101723-create-message.js +++ b/src/api/db/migrations/20221030101723-create-message.js @@ -12,6 +12,16 @@ module.exports = { message: { type: Sequelize.STRING }, + senderId:{ + type:Sequelize.UUID, + allowNull:false, + foreignKey:true + }, + receiverId:{ + type:Sequelize.UUID, + allowNull:false, + foreignKey:true + }, createdAt: { allowNull: false, type: Sequelize.DATE diff --git a/src/api/db/models/assignment.js b/src/api/db/models/assignment.js index ed997fa..0c12c0b 100644 --- a/src/api/db/models/assignment.js +++ b/src/api/db/models/assignment.js @@ -11,7 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Assignment.belongsTo(models.User, {foreignKey: 'teacherId', as: 'teacher'}); + // Assignment.belongsTo(models.User, {foreignKey: 'teacherId', as: 'teacher'}); Assignment.belongsTo(models.User, {foreignKey: 'studentId', as: 'student'}); Assignment.belongsTo(models.Class, {foreignKey: 'classId', as: 'class'}); } @@ -19,7 +19,8 @@ module.exports = (sequelize, DataTypes) => { Assignment.init({ id:{ type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4 + defaultValue: DataTypes.UUIDV4, + primaryKey: true }, assignment:{ type: DataTypes.STRING, @@ -27,15 +28,18 @@ module.exports = (sequelize, DataTypes) => { }, classId:{ type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true }, teacherId:{ type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true }, studentId:{ type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true } }, { sequelize, diff --git a/src/api/db/models/assignmentscore.js b/src/api/db/models/assignmentscore.js index be142c0..b7d4f4f 100644 --- a/src/api/db/models/assignmentscore.js +++ b/src/api/db/models/assignmentscore.js @@ -12,18 +12,20 @@ module.exports = (sequelize, DataTypes) => { static associate(models) { // define association here AssignmentScore.belongsTo(models.Assignment, {foreignKey:'assignmentId', as: 'assignment'}); - AssignmentScore.belongsTo(models.User, {foreignKey: 'studentId', as: 'student'}); + // AssignmentScore.belongsTo(models.User, {foreignKey: 'studentId', as: 'student'}); AssignmentScore.belongsTo(models.User, {foreignKey: 'teacherId', as: 'teacher'}); } } AssignmentScore.init({ id:{ type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4 + defaultValue: DataTypes.UUIDV4, + primaryKey: true }, assignmentId: { type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true }, score: { type:DataTypes.STRING, @@ -31,11 +33,13 @@ module.exports = (sequelize, DataTypes) => { }, studentId: { type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true }, teacherId: { type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true } }, { sequelize, diff --git a/src/api/db/models/class.js b/src/api/db/models/class.js index 1b83082..8cc2e45 100644 --- a/src/api/db/models/class.js +++ b/src/api/db/models/class.js @@ -11,7 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Class.hasMany(models.ClassStudent, {as: 'student'}); + // Class.hasMany(models.ClassStudent, {as: 'student'}); Class.hasMany(models.User, {as: 'teacher'}); } @@ -19,7 +19,8 @@ module.exports = (sequelize, DataTypes) => { Class.init({ id:{ type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4 + defaultValue: DataTypes.UUIDV4, + primaryKey: true }, className: { type:DataTypes.STRING, diff --git a/src/api/db/models/classstudent.js b/src/api/db/models/classstudent.js index f5df2a1..9ba2cd3 100644 --- a/src/api/db/models/classstudent.js +++ b/src/api/db/models/classstudent.js @@ -11,7 +11,8 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Class.belongsTo(models.Class, {foreignKey: 'classId', as: 'class'}); + ClassStudent.belongsTo(models.Class, {foreignKey: 'classId', as: 'class'}); + ClassStudent.belongsTo(models.Class, {foreignKey: 'studentId', as: 'student'}); } } ClassStudent.init({ @@ -19,15 +20,18 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, allowNull:false, - unique:true + unique:true, + primaryKey: true }, studentId:{ type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true }, classId: { type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true } }, { sequelize, diff --git a/src/api/db/models/classteacher.js b/src/api/db/models/classteacher.js index c2fe1e0..49d0dae 100644 --- a/src/api/db/models/classteacher.js +++ b/src/api/db/models/classteacher.js @@ -10,22 +10,25 @@ module.exports = (sequelize, DataTypes) => { * The `models/index` file will call this method automatically. */ static associate(models) { - Class.belongsTo(models.Class, {foreignKey: 'classId', as: 'class'}); - Class.belongsTo(models.User, {foreignKey: 'teacherId', as: 'teacher'}); + ClassTeacher.belongsTo(models.Class, {foreignKey: 'classId', as: 'class'}); + ClassTeacher.belongsTo(models.User, {foreignKey: 'teacherId', as: 'teacher'}); } } ClassTeacher.init({ id:{ type: DataTypes.UUID, - allowNull:false + allowNull:false, + primaryKey: true }, teacherId:{ type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true }, classId: { type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true } }, { sequelize, diff --git a/src/api/db/models/index.js b/src/api/db/models/index.js index dd6c895..c73b52c 100644 --- a/src/api/db/models/index.js +++ b/src/api/db/models/index.js @@ -1,7 +1,7 @@ import fs from 'fs'; import path from 'path'; import Sequelize from 'sequelize'; -import configJson from '../config/config'; +import configJson from '../config/config.js'; const basename = path.basename(__filename); let env = process.env.NODE_ENV ? process.env.NODE_ENV : 'development'; diff --git a/src/api/db/models/message.js b/src/api/db/models/message.js index 44636b3..95df839 100644 --- a/src/api/db/models/message.js +++ b/src/api/db/models/message.js @@ -11,22 +11,25 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here - Class.belongsTo(models.User, {foreignKey: 'sender', as: 'sender'}); - Class.belongsTo(models.User, {foreignKey: 'receiver', as: 'receiver'}); + Message.belongsTo(models.User, {foreignKey: 'senderId', as: 'sender'}); + Message.belongsTo(models.User, {foreignKey: 'receiverId', as: 'receiver'}); } } Message.init({ message: { type:DataTypes.STRING, - allowNull:false + allowNull:false, + primaryKey: true }, - sender:{ + senderId:{ type:DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true }, - receiver:{ + receiverId:{ type:DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true } }, { diff --git a/src/api/db/models/notice.js b/src/api/db/models/notice.js index d37bd6a..f91bab5 100644 --- a/src/api/db/models/notice.js +++ b/src/api/db/models/notice.js @@ -18,15 +18,18 @@ module.exports = (sequelize, DataTypes) => { Notice.init({ notice: { type:DataTypes.STRING, - allowNull:false + allowNull:false, + primaryKey: true }, classId: { type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true }, teacherId: { type: DataTypes.UUID, - allowNull:false + allowNull:false, + foreignKey:true } }, { sequelize, diff --git a/src/api/db/models/role.js b/src/api/db/models/role.js index 6ffc329..23ae6e2 100644 --- a/src/api/db/models/role.js +++ b/src/api/db/models/role.js @@ -17,7 +17,8 @@ module.exports = (sequelize, DataTypes) => { Role.init({ id:{ type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4 + defaultValue: DataTypes.UUIDV4, + primaryKey: true }, role: { type: DataTypes.UUID, diff --git a/src/api/db/models/user.js b/src/api/db/models/user.js index 24bb980..a43fd4e 100644 --- a/src/api/db/models/user.js +++ b/src/api/db/models/user.js @@ -14,15 +14,16 @@ module.exports = (sequelize, DataTypes) => { // define association here User.hasMany(models.Assignment, {foreignKey: 'assignmentId', as: 'assignment'}) User.hasMany(models.AssignmentScore, {foreignKey: 'assignmentScoreId', as: 'assignmentScore'}) - User.belongsTo(models.Message, {foreignKey: 'sender', as: 'sender'}); - User.belongsTo(models.Message, {foreignKey: 'receiver', as: 'receiver'}); + User.hasMany(models.Message, {foreignKey: 'senderId', as: 'sender'}); + User.hasMany(models.Message, {foreignKey: 'receiverId', as: 'receiver'}); User.belongsTo(models.Role, {foreignKey: 'roleId', as: 'role'}) } } User.init({ id:{ type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4 + defaultValue: DataTypes.UUIDV4, + primaryKey: true }, first_name: { allowNull: false, type:DataTypes.STRING diff --git a/src/api/routers/MessageRouter.js b/src/api/routers/MessageRouter.js index e4faaed..3f307ef 100644 --- a/src/api/routers/MessageRouter.js +++ b/src/api/routers/MessageRouter.js @@ -3,10 +3,10 @@ import MessageController from '../controllers/MessageController.js'; const messageRouter = Router(); -router.get('/', MessageController.getAllMessages); -router.post('/', MessageController.addMessage); -router.get('/:id', MessageController.getAMessage); -router.put('/:id', MessageController.updatedMessage); -router.delete('/:id', MessageController.deleteMessage); +messageRouter.get('/', MessageController.getAllMessages); +messageRouter.post('/', MessageController.addMessage); +messageRouter.get('/:id', MessageController.getAMessage); +messageRouter.put('/:id', MessageController.updatedMessage); +messageRouter.delete('/:id', MessageController.deleteMessage); export default messageRouter; \ No newline at end of file diff --git a/src/api/services/MessageService.js b/src/api/services/MessageService.js index 9ad970c..b897b40 100644 --- a/src/api/services/MessageService.js +++ b/src/api/services/MessageService.js @@ -1,4 +1,4 @@ -import database from '../db/models'; +import database from '../db/models/index.js'; class MessageService { static async getAllMessages() { diff --git a/src/api/utils/Utils.js b/src/api/utils/Utils.js new file mode 100644 index 0000000..9aa63c3 --- /dev/null +++ b/src/api/utils/Utils.js @@ -0,0 +1,37 @@ +export default class Util { + constructor() { + this.statusCode = null; + this.type = null; + this.data = null; + this.message = null; + } + + setSuccess(statusCode, message, data) { + this.statusCode = statusCode; + this.message = message; + this.data = data; + this.type = 'success'; + } + + setError(statusCode, message) { + this.statusCode = statusCode; + this.message = message; + this.type = 'error'; + } + + send(res) { + const result = { + status: this.type, + message: this.message, + data: this.data, + }; + + if (this.type === 'success') { + return res.status(this.statusCode).json(result); + } + return res.status(this.statusCode).json({ + status: this.type, + message: this.message, + }); + } + } \ No newline at end of file From 0a23d0d2703330728892f84c7977c7257479c98c Mon Sep 17 00:00:00 2001 From: Ekemiben Date: Mon, 21 Nov 2022 10:43:28 +0100 Subject: [PATCH 8/9] Creating Teacher's CRUD Module --- .env.example | 6 +- src/api/controllers/TeacherController.js | 124 ++++++++++++++++++ src/api/db/config/config.js | 10 +- .../20221030101838-create-class-teacher.js | 13 +- src/api/db/models/classteacher.js | 1 + src/api/index.js | 25 ---- src/api/routers/TeacherRouter.js | 13 ++ src/api/services/TeacherServices.js | 68 ++++++++++ src/api/utils/Utils.js | 8 ++ src/index.js | 6 +- 10 files changed, 239 insertions(+), 35 deletions(-) create mode 100644 src/api/controllers/TeacherController.js delete mode 100644 src/api/index.js create mode 100644 src/api/routers/TeacherRouter.js create mode 100644 src/api/services/TeacherServices.js diff --git a/.env.example b/.env.example index 0b33b40..e68b39b 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,5 @@ -PORT = \ No newline at end of file +database=classManager +username=postgres +password=123456789 +host=127.0.0.1 +dialect=postgres \ No newline at end of file diff --git a/src/api/controllers/TeacherController.js b/src/api/controllers/TeacherController.js new file mode 100644 index 0000000..8a7c46b --- /dev/null +++ b/src/api/controllers/TeacherController.js @@ -0,0 +1,124 @@ +import { response } from 'express'; +import TeacherService from '../services/TeacherServices.js' +import Util from '../utils/Utils.js'; + +const util = new Util(); + +class teacherController { + static async home(req, res) { + res.send(`

Welcome to the teacher's Route

`) + } + + static async getAllTeachers(req, res) { + try { + const allTeacher = await TeacherService.getAllTeachers(); + if (allTeacher.length > 0) { + util.setSuccess(200, 'teachers retrieved', allTeacher); + } else { + util.setSuccess(200, 'No teahcer found in the database'); + } + return util.send(res); + } catch (error) { + util.setError(400, error); + return util.send(res); + } + } + + static async addTeacher(req, res) { + if (!req.body.teacherId || !req.body.classId ) { + util.setError(400, 'Please provide complete details of the teacher'); + return util.send(res); + } + const newTeacher = req.body; + try { + const createdTeacher = await TeacherService.addTeacher(newTeacher); + util.setSuccess(201, 'Teacher Added Successfully!', createdTeacher); + return util.send(res); + } catch (error) { + util.setError(400, error.teacher); + return util.send(res); + } + } + + static async updatedTeacher(req, res) { + const alteredTeacher = req.body; + const { id } = req.params; + if (!Number(id)) { + util.setError(400, 'Please input a valid numeric value'); + return util.send(res); + } + try { + const updateTeacher = await TeacherService.updateTeacher(id, alteredTeacher); + if (!updateTeacher) { + util.setError(404, `Cannot find a teacher with the id: ${id}`); + } else { + util.setSuccess(200, 'Teacher updated', updateTeacher); + } + return util.send(res); + } catch (error) { + util.setError(404, error); + return util.send(res); + } + } + + static async getATeacher(req, res) { + const { id } = req.params; + + if (!util.checkIfValidUUID(id)) { + util.setError(400, 'Please input a valid numeric value'); + return util.send(res); + } + + try { + const theTeacher = await TeacherService.getATeacher(id); + + if (!theTeacher) { + util.setError(404, `Cannot find a teacher with the id ${id}`); + } else { + util.setSuccess(200, 'Found Teacher', theTeacher); + } + return util.send(res); + } catch (error) { + util.setError(404, error); + return util.send(res); + } + } + + + + + // static getATeacher = async(req, res)=> { + // try{ + // const teacherById = await TeacherService.findById(req.params.id) + // res.json(teacherById) + // }catch(err){ + // res.send('Error' + err) + // } + + // } + + static async deleteTeacher(req, res) { + const { id } = req.params; + + if (!util.checkIfValidUUID(id)) { + util.setError(400, 'Please provide a numeric value'); + return util.send(res); + } + + try { + const teacherToDelete = await TeacherService.deleteTeacher(id); + + if (teacherToDelete) { + util.setSuccess(200, `Teacher with ${id} deleted`); + } else { + util.setError(404, `Teacher with the id ${id} cannot be found`); + } + return util.send(res); + } catch (error) { + util.setError(400, error); + return util.send(res); + } + } +} + +export default teacherController; \ No newline at end of file diff --git a/src/api/db/config/config.js b/src/api/db/config/config.js index e826292..e299efc 100644 --- a/src/api/db/config/config.js +++ b/src/api/db/config/config.js @@ -1,10 +1,10 @@ - +require("dotenv").config module.exports = { development: { - database: 'classManager', - username: 'postgres', - password: "123456789", - host: '127.0.0.1', + database: "classManager", + username: "postgres", + password: "15263", + host: process.env.host, dialect: 'postgres' }, local: { diff --git a/src/api/db/migrations/20221030101838-create-class-teacher.js b/src/api/db/migrations/20221030101838-create-class-teacher.js index a7efd88..30de4c7 100644 --- a/src/api/db/migrations/20221030101838-create-class-teacher.js +++ b/src/api/db/migrations/20221030101838-create-class-teacher.js @@ -5,12 +5,19 @@ module.exports = { await queryInterface.createTable('ClassTeachers', { id: { allowNull: false, - autoIncrement: true, + defaultValue:Sequelize.UUIDV4, primaryKey: true, - type: Sequelize.INTEGER + type: Sequelize.UUID }, classId: { - type: Sequelize.STRING + type: Sequelize.UUID, + allowNull:false, + foreignKey:true + }, + teacherId:{ + type: Sequelize.UUID, + allowNull:false, + foreignKey:true }, createdAt: { allowNull: false, diff --git a/src/api/db/models/classteacher.js b/src/api/db/models/classteacher.js index 49d0dae..2ff4161 100644 --- a/src/api/db/models/classteacher.js +++ b/src/api/db/models/classteacher.js @@ -17,6 +17,7 @@ module.exports = (sequelize, DataTypes) => { ClassTeacher.init({ id:{ type: DataTypes.UUID, + defaultValue:DataTypes.UUIDV4, allowNull:false, primaryKey: true }, diff --git a/src/api/index.js b/src/api/index.js deleted file mode 100644 index ad19a00..0000000 --- a/src/api/index.js +++ /dev/null @@ -1,25 +0,0 @@ -import config from 'dotenv'; -import express from 'express'; -config.config(); - -const app = express(); - -// when a random route is inputed -// app.get('*', (req, res) => res.status(200).send({ -// message: 'Welcome to this API.', -// })); - -app.get('/', (req, res)=>{ - res.send({ - message: 'Welcome to this API.', - }) -}) - -const port = process.env.PORT || 8000; -app.listen(process.env.port || port, ()=>{ - console.log(`Server started at port ${port}`); -}) - - - -export default app; diff --git a/src/api/routers/TeacherRouter.js b/src/api/routers/TeacherRouter.js new file mode 100644 index 0000000..2e0176c --- /dev/null +++ b/src/api/routers/TeacherRouter.js @@ -0,0 +1,13 @@ +import { Router } from "express"; +import teacherController from '../controllers/TeacherController.js' + +const teacherRouter = Router(); + +teacherRouter.get('/', teacherController.getAllTeachers); +teacherRouter.get('/home', teacherController.home); +teacherRouter.post('/', teacherController.addTeacher); +teacherRouter.get('/:id', teacherController.getATeacher); +teacherRouter.put('/:id', teacherController.updatedTeacher); +teacherRouter.delete('/:id', teacherController.deleteTeacher); + +export { teacherRouter }; \ No newline at end of file diff --git a/src/api/services/TeacherServices.js b/src/api/services/TeacherServices.js new file mode 100644 index 0000000..f2e8ef3 --- /dev/null +++ b/src/api/services/TeacherServices.js @@ -0,0 +1,68 @@ +import database from '../db/models/index.js'; + +class TeacherService { + static async getAllTeachers() { + try { + const result = await database.ClassTeacher.findAll(); + return result; + } catch (error) { + throw error; + } + } + + static async addTeacher(newTeacher) { + try { + const result = await database.ClassTeacher.create(newTeacher); + return result; + } catch (error) { + throw error; + } + } + + static async updateTeacher(id, updateTeacher) { + try { + const teacherToUpdate = await database.ClassTeacher.findOne({ + where: { id: Number(id) } + }); + + if (teacherToUpdate) { + await database.ClassTeacher.update(updateTeacher, { where: { id: Number(id) } }); + + return updateTeacher; + } + return null; + } catch (error) { + throw error; + } + } + + static async getAllTeachers(id) { + try { + const allTeacher = await database.ClassTeacher.findOne({ + where: { id: Number(id) } + }); + + return allTeacher; + } catch (error) { + throw error; + } + } + + static async deleteTeacher(id) { + try { + const TeacherToDelete = await database.ClassTeacher.findOne({ where: { id: Number(id) } }); + + if (TeacherToDelete) { + const deletedTeacher = await database.ClassTeacher.destroy({ + where: { id: Number(id) } + }); + return deletedTeacher; + } + return null; + } catch (error) { + throw error; + } + } +} + +export default TeacherService; \ No newline at end of file diff --git a/src/api/utils/Utils.js b/src/api/utils/Utils.js index 9aa63c3..17e571d 100644 --- a/src/api/utils/Utils.js +++ b/src/api/utils/Utils.js @@ -34,4 +34,12 @@ export default class Util { message: this.message, }); } + + checkIfValidUUID(str) { + // Regular expression to check if string is a valid UUID + const regexExp = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/gi; + // const PWD_REGEX = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%]).{8,24}$/; + + return regexExp.test(str); + } } \ No newline at end of file diff --git a/src/index.js b/src/index.js index 4b6fe5f..eed9970 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,8 @@ import express from "express"; import dotenv from "dotenv"; import messageRouter from "./api/routers/MessageRouter.js"; +import {teacherRouter} from "./api/routers/TeacherRouter.js"; + const app = express(); dotenv.config(); @@ -8,7 +10,9 @@ dotenv.config(); // Middlewares app.use(express.json()); app.use(express.urlencoded()); -app.use('/api', messageRouter); +app.use("/api/teacher", teacherRouter) +app.use('/api/message', messageRouter); + app app.get('/', (req, res)=>{ From d995c9d29470faca1220eb607448be20b85a4906 Mon Sep 17 00:00:00 2001 From: Ekemiben Date: Fri, 25 Nov 2022 11:36:40 +0100 Subject: [PATCH 9/9] chore(teachers crud): created crud endpoint for teacher --- src/api/controllers/TeacherController.js | 6 +++--- src/api/services/TeacherServices.js | 12 ++++++------ src/api/utils/Utils.js | 7 +++++++ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/api/controllers/TeacherController.js b/src/api/controllers/TeacherController.js index 8a7c46b..8a16af9 100644 --- a/src/api/controllers/TeacherController.js +++ b/src/api/controllers/TeacherController.js @@ -15,7 +15,7 @@ class teacherController { if (allTeacher.length > 0) { util.setSuccess(200, 'teachers retrieved', allTeacher); } else { - util.setSuccess(200, 'No teahcer found in the database'); + util.setFound(400, 'No teahcer found in the database'); } return util.send(res); } catch (error) { @@ -43,8 +43,8 @@ class teacherController { static async updatedTeacher(req, res) { const alteredTeacher = req.body; const { id } = req.params; - if (!Number(id)) { - util.setError(400, 'Please input a valid numeric value'); + if (!util.checkIfValidUUID(id)) { + util.setError(400, 'Please input a valid Id'); return util.send(res); } try { diff --git a/src/api/services/TeacherServices.js b/src/api/services/TeacherServices.js index f2e8ef3..6f58930 100644 --- a/src/api/services/TeacherServices.js +++ b/src/api/services/TeacherServices.js @@ -22,11 +22,11 @@ class TeacherService { static async updateTeacher(id, updateTeacher) { try { const teacherToUpdate = await database.ClassTeacher.findOne({ - where: { id: Number(id) } + where: { id: id } }); if (teacherToUpdate) { - await database.ClassTeacher.update(updateTeacher, { where: { id: Number(id) } }); + await database.ClassTeacher.update(updateTeacher, { where: { id: id } }); return updateTeacher; } @@ -36,10 +36,10 @@ class TeacherService { } } - static async getAllTeachers(id) { + static async getATeacher(id) { try { const allTeacher = await database.ClassTeacher.findOne({ - where: { id: Number(id) } + where: { id: id } }); return allTeacher; @@ -50,11 +50,11 @@ class TeacherService { static async deleteTeacher(id) { try { - const TeacherToDelete = await database.ClassTeacher.findOne({ where: { id: Number(id) } }); + const TeacherToDelete = await database.ClassTeacher.findOne({ where: { id: id } }); if (TeacherToDelete) { const deletedTeacher = await database.ClassTeacher.destroy({ - where: { id: Number(id) } + where: { id: id } }); return deletedTeacher; } diff --git a/src/api/utils/Utils.js b/src/api/utils/Utils.js index 17e571d..f4cf815 100644 --- a/src/api/utils/Utils.js +++ b/src/api/utils/Utils.js @@ -18,6 +18,13 @@ export default class Util { this.message = message; this.type = 'error'; } + + setFound(statusCode, message, data){ + this.statusCode = statusCode; + this.message = message; + this.data = data; + this.type = "Record not found" + } send(res) { const result = {