diff --git a/controllers/categories.js b/controllers/categories.js new file mode 100644 index 00000000..ac9176e4 --- /dev/null +++ b/controllers/categories.js @@ -0,0 +1,33 @@ +let express = require('express') +let db = require('../models') +let router = express.Router() + +router.get("/", (req, res) => { + db.category.findAll() + .then((categories) => { + + res.render("categories/show", {categories}) + }) +}) + +router.get("/:id", async (req, res) => { + try { + catId = req.params.id; + // EAGER LOADING + const categoryInfo = await db.category.findByPk(catId, { + include: [db.project] + }) + + // LAZY LOADING + // const categoryInfo = await db.category.findByPk(catId); + // const projectInfo = await categoryInfo.getProjects(); + + // console.log("cat info", categoryInfo) + // console.log("proj info", projectInfo) + res.render("categories/details", { categoryInfo}) +} catch (error) { + console.log(error) + } +}) + +module.exports = router; diff --git a/controllers/projects.js b/controllers/projects.js index 3d878a8a..d6ca8a97 100644 --- a/controllers/projects.js +++ b/controllers/projects.js @@ -3,19 +3,26 @@ let db = require('../models') let router = express.Router() // POST /projects - create a new project -router.post('/', (req, res) => { - db.project.create({ +router.post('/', async (req, res) => { + try { + console.log(req.body); + const newProject = await db.project.create( { name: req.body.name, githubLink: req.body.githubLink, deployLink: req.body.deployedLink, - description: req.body.description + description: req.body.description, }) - .then((project) => { - res.redirect('/') + const [newCategory] = await db.category.findOrCreate({ + where: { + name: req.body.category + } }) - .catch((error) => { + // returns [newCategory, true/false] + await newProject.addCategory(newCategory); + res.redirect('/') +} catch (err) { res.status(400).render('main/404') - }) + } }) // GET /projects/new - display form for creating a new project diff --git a/dbTest.js b/dbTest.js new file mode 100644 index 00000000..41a3f5ad --- /dev/null +++ b/dbTest.js @@ -0,0 +1,37 @@ +// const db = require('./models') + +// db.category.create({ +// name: 'node' +// }) +// .then(category => { +// console.log(category.id) +// }) +// .catch(console.log) + +// async function createCategory() { +// try { +// const newCategory = await db.category.create({ name: 'python' }) +// console.log(newCategory) +// } catch (err) { +// console.log(err) +// } +// } + +// createCategory() + +const db = require('./models') + +db.project.findOne({ + where: { id: 1 }, + include: [db.category] + }) + .then(project => { + // by using eager loading, the project model should have a categories key + console.log(project.categories) + + // createCategory function should be available to this model - it will create the category then add it to the project + project.createCategory({ name: 'express' }) + .then(category => { + console.log(category.id) + }) + }) \ No newline at end of file diff --git a/index.js b/index.js index f404f83d..e9753548 100644 --- a/index.js +++ b/index.js @@ -24,6 +24,7 @@ app.get('/', (req, res) => { }) app.use('/projects', require('./controllers/projects')) +app.use('/categories', require('./controllers/categories')) app.get('*', (req, res) => { res.render('main/404') diff --git a/migrations/20230405222642-create-category.js b/migrations/20230405222642-create-category.js new file mode 100644 index 00000000..8e52fd79 --- /dev/null +++ b/migrations/20230405222642-create-category.js @@ -0,0 +1,28 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('categories', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + name: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('categories'); + } +}; \ No newline at end of file diff --git a/migrations/20230405223435-create-categories-projects.js b/migrations/20230405223435-create-categories-projects.js new file mode 100644 index 00000000..4e407a24 --- /dev/null +++ b/migrations/20230405223435-create-categories-projects.js @@ -0,0 +1,31 @@ +'use strict'; +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.createTable('categoriesProjects', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + categoryId: { + type: Sequelize.INTEGER + }, + projectId: { + type: Sequelize.INTEGER + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + async down(queryInterface, Sequelize) { + await queryInterface.dropTable('categoriesProjects'); + } +}; \ No newline at end of file diff --git a/models/categoriesprojects.js b/models/categoriesprojects.js new file mode 100644 index 00000000..ddb47da2 --- /dev/null +++ b/models/categoriesprojects.js @@ -0,0 +1,24 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class categoriesProjects extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + } + } + categoriesProjects.init({ + categoryId: DataTypes.INTEGER, + projectId: DataTypes.INTEGER + }, { + sequelize, + modelName: 'categoriesProjects', + }); + return categoriesProjects; +}; \ No newline at end of file diff --git a/models/category.js b/models/category.js new file mode 100644 index 00000000..e3bda543 --- /dev/null +++ b/models/category.js @@ -0,0 +1,24 @@ +'use strict'; +const { + Model +} = require('sequelize'); +module.exports = (sequelize, DataTypes) => { + class category extends Model { + /** + * Helper method for defining associations. + * This method is not a part of Sequelize lifecycle. + * The `models/index` file will call this method automatically. + */ + static associate(models) { + // define association here + models.category.belongsToMany(models.project, { through: "categoriesProjects"}) + } + } + category.init({ + name: DataTypes.STRING + }, { + sequelize, + modelName: 'category', + }); + return category; +}; \ No newline at end of file diff --git a/models/project.js b/models/project.js index 735a0a47..272e568b 100644 --- a/models/project.js +++ b/models/project.js @@ -11,6 +11,7 @@ module.exports = (sequelize, DataTypes) => { */ static associate(models) { // define association here + models.project.belongsToMany(models.category, { through: "categoriesProjects"}) } } project.init({ diff --git a/scratch-pad.txt b/scratch-pad.txt new file mode 100644 index 00000000..3354ee38 --- /dev/null +++ b/scratch-pad.txt @@ -0,0 +1,61 @@ +As a user, I want to categorize projects using different names. For example, all of my Node projects will be under the category "Node". + + +As a user, I want to assign multiple categories to a single project. +As a user, I want to view a list of categories I've assigned. +As a user, I want to view projects associated with a category I've selected. + +Part 1: Create a Category model +In order to add categories, create a Sequelize model to store categories. It's recommended that you name this model category. It will store one attribute: the name of the category (a string). + +Once this model has been created, run the migration for the model and test the model's functionality. This can be done in a separate file. An example: + + +------------------------- + +sequelize model:create --name category --attributes name:string + +sequelize model:create --name categoriesProjects --attributes categoryId:integer,projectId:integer + + + + +----------------------------- + + + .then( () => { + const newCategory = db.category.findOrCreate({ + category: req.body.category + }) + return newCategory; +}) + .then(() => { + newProject.addCategory(newCategory); + }) + + + + ----------------- + + .then(() => { + const categoryDetails = db.category.findOne({ + where: { + name: req.body.category + } + } + ) + return categoryDetails + .then ( () => { + + const projectDetails = db.project.findOne({ + where: { + name: req.body.name, + githubLink: req.body.githubLink, + deployLink: req.body.deployedLink, + description: req.body.description, + } + }) + return projectDetails + }) +}) +projectDetails.addCategory(categoryDetails) \ No newline at end of file diff --git a/views/categories/details.ejs b/views/categories/details.ejs new file mode 100644 index 00000000..94770e20 --- /dev/null +++ b/views/categories/details.ejs @@ -0,0 +1,6 @@ +