From 291bad6d562f994be487f91955fe00d8fbd1261e Mon Sep 17 00:00:00 2001 From: Takeshi Kimata <117462761+kimatata@users.noreply.github.com> Date: Mon, 12 Feb 2024 18:47:39 +0900 Subject: [PATCH] create cases table --- backend/index.js | 6 ++ .../20240204090345-create-projects.js | 4 +- .../migrations/20240212084228-create-cases.js | 72 +++++++++++++++++++ backend/models/cases.js | 57 +++++++++++++++ backend/models/folders.js | 11 ++- backend/models/runs.js | 11 ++- backend/routes/cases/index.js | 30 ++++++++ backend/routes/cases/new.js | 36 ++++++++++ backend/seeders/seed.js | 32 +++++++++ 9 files changed, 255 insertions(+), 4 deletions(-) create mode 100644 backend/migrations/20240212084228-create-cases.js create mode 100644 backend/models/cases.js create mode 100644 backend/routes/cases/index.js create mode 100644 backend/routes/cases/new.js diff --git a/backend/index.js b/backend/index.js index 153c5e0..94fbf68 100644 --- a/backend/index.js +++ b/backend/index.js @@ -41,6 +41,12 @@ const runsNewRoute = require('./routes/runs/new')(sequelize); app.use('/runs', runsIndexRoute); app.use('/runs', runsNewRoute); +// "/cases" +const casesIndexRoute = require('./routes/cases/index')(sequelize); +const casesNewRoute = require('./routes/cases/new')(sequelize); +app.use('/cases', casesIndexRoute); +app.use('/cases', casesNewRoute); + const PORT = process.env.PORT || 3001; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); diff --git a/backend/migrations/20240204090345-create-projects.js b/backend/migrations/20240204090345-create-projects.js index ea41e19..22af2d7 100644 --- a/backend/migrations/20240204090345-create-projects.js +++ b/backend/migrations/20240204090345-create-projects.js @@ -3,7 +3,7 @@ /** @type {import('sequelize-cli').Migration} */ module.exports = { up: async (queryInterface, Sequelize) => { - await queryInterface.createTable('Projects', { + await queryInterface.createTable('projects', { id: { type: Sequelize.INTEGER, primaryKey: true, @@ -29,6 +29,6 @@ module.exports = { }, down: async (queryInterface, Sequelize) => { - await queryInterface.dropTable('Projects'); + await queryInterface.dropTable('projects'); }, }; \ No newline at end of file diff --git a/backend/migrations/20240212084228-create-cases.js b/backend/migrations/20240212084228-create-cases.js new file mode 100644 index 0000000..45dff97 --- /dev/null +++ b/backend/migrations/20240212084228-create-cases.js @@ -0,0 +1,72 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + await queryInterface.createTable('cases', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + }, + folderId: { + type: Sequelize.INTEGER, + allowNull: false, + references: { + model: 'folders', + key: 'id', + }, + onUpdate: 'CASCADE', + onDelete: 'CASCADE', + }, + title: { + type: Sequelize.STRING, + allowNull: false, + }, + state: { + type: Sequelize.INTEGER, + allowNull: false, + }, + priority: { + type: Sequelize.INTEGER, + allowNull: false, + }, + type: { + type: Sequelize.INTEGER, + allowNull: false, + }, + automationStatus: { + type: Sequelize.INTEGER, + allowNull: false, + }, + description: { + type: Sequelize.STRING, + allowNull: true, + }, + template: { + type: Sequelize.INTEGER, + allowNull: false, + }, + preConditions: { + type: Sequelize.STRING, + allowNull: true, + }, + expectedResults: { + type: Sequelize.STRING, + allowNull: true, + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + + async down (queryInterface, Sequelize) { + await queryInterface.dropTable('cases'); + } +}; diff --git a/backend/models/cases.js b/backend/models/cases.js new file mode 100644 index 0000000..a96f1ac --- /dev/null +++ b/backend/models/cases.js @@ -0,0 +1,57 @@ +function defineCase(sequelize, DataTypes) { + const Case = sequelize.define('Case', { + title: { + type: DataTypes.STRING, + allowNull: false, + }, + state: { + type: DataTypes.INTEGER, + allowNull: false, + }, + priority: { + type: DataTypes.INTEGER, + allowNull: false, + }, + type: { + type: DataTypes.INTEGER, + allowNull: false, + }, + automationStatus: { + type: DataTypes.INTEGER, + allowNull: false, + }, + description: { + type: DataTypes.STRING, + allowNull: true, + }, + template: { + type: DataTypes.INTEGER, + allowNull: false, + }, + preConditions: { + type: DataTypes.STRING, + allowNull: true, + }, + expectedResults: { + type: DataTypes.STRING, + allowNull: true, + }, + folderId: { + type: DataTypes.INTEGER, + allowNull: false, + references: { + model: 'folder', + key: 'id' + }, + onDelete: 'CASCADE' + } + }); + + Case.associate = (models) => { + Case.belongsTo(models.folder, { foreignKey: 'folderId', onDelete: 'CASCADE' }); + }; + + return Case; +} + +module.exports = defineCase; \ No newline at end of file diff --git a/backend/models/folders.js b/backend/models/folders.js index ceb2f0c..2977fba 100644 --- a/backend/models/folders.js +++ b/backend/models/folders.js @@ -15,9 +15,18 @@ function defineFolder(sequelize, DataTypes) { projectId: { type: DataTypes.INTEGER, allowNull: false, - }, + references: { + model: 'project', + key: 'id' + }, + onDelete: 'CASCADE' + } }); + Folder.associate = (models) => { + Folder.belongsTo(models.Project, { foreignKey: 'projectId', onDelete: 'CASCADE' }); + }; + return Folder; } diff --git a/backend/models/runs.js b/backend/models/runs.js index 0180d74..75bd53b 100644 --- a/backend/models/runs.js +++ b/backend/models/runs.js @@ -19,9 +19,18 @@ function defineRun(sequelize, DataTypes) { projectId: { type: DataTypes.INTEGER, allowNull: false, - }, + references: { + model: 'project', + key: 'id' + }, + onDelete: 'CASCADE' + } }); + Run.associate = (models) => { + Run.belongsTo(models.Project, { foreignKey: 'projectId', onDelete: 'CASCADE' }); + }; + return Run; } diff --git a/backend/routes/cases/index.js b/backend/routes/cases/index.js new file mode 100644 index 0000000..e23a1ea --- /dev/null +++ b/backend/routes/cases/index.js @@ -0,0 +1,30 @@ +const express = require("express"); +const router = express.Router(); +const defineCase = require("../../models/cases"); +const { DataTypes } = require('sequelize'); + +module.exports = function(sequelize) { + const Run = defineCase(sequelize, DataTypes) + + router.get("/", async (req, res) => { + const { folderId } = req.query; + + if (!folderId) { + return res.status(400).json({ error: 'folderId is required' }); + } + + try { + const runs = await Run.findAll({ + where: { + folderId: folderId + } + }); + res.json(runs); + } catch (error) { + console.error(error); + res.status(500).send("Internal Server Error"); + } + }); + + return router; +}; \ No newline at end of file diff --git a/backend/routes/cases/new.js b/backend/routes/cases/new.js new file mode 100644 index 0000000..281a8a2 --- /dev/null +++ b/backend/routes/cases/new.js @@ -0,0 +1,36 @@ +const express = require("express"); +const router = express.Router(); +const defineCase = require("../../models/cases"); +const { DataTypes } = require("sequelize"); + +module.exports = function (sequelize) { + const Case = defineCase(sequelize, DataTypes); + + router.post("/", async (req, res) => { + try { + const { title, state, priority, type, automationStatus, description, template, preConditions, expectedResults, folderId } = req.body; + if (!title || !state || !priority || !type || !automationStatus || !template || !folderId) { + return res.status(400).json({ error: "Title, state, priority, type, automationStatus, template, and folderId are required" }); + } + + const newCase = await Case.create({ + title, + state, + priority, + type, + automationStatus, + description, + template, + preConditions, + expectedResults, + folderId, + }); + + res.json(newCase); + } catch (error) { + res.status(500).json({ error: "Internal server error" }); + } + }); + + return router; +}; diff --git a/backend/seeders/seed.js b/backend/seeders/seed.js index 7b51112..cd73a9f 100644 --- a/backend/seeders/seed.js +++ b/backend/seeders/seed.js @@ -75,6 +75,38 @@ module.exports = { updatedAt: new Date(), }, ]); + + // Add cases table records + await queryInterface.bulkInsert('cases', [ + { + title: 'Sample Case 1', + state: 1, + priority: 1, + type: 1, + automationStatus: 1, + description: 'Sample description for case 1', + template: 1, + preConditions: 'Sample pre-conditions for case 1', + expectedResults: 'Sample expected results for case 1', + folderId: 1, + createdAt: new Date(), + updatedAt: new Date(), + }, + { + title: 'Sample Case 2', + state: 1, + priority: 1, + type: 1, + automationStatus: 1, + description: 'Sample description for case 2', + template: 1, + preConditions: 'Sample pre-conditions for case 2', + expectedResults: 'Sample expected results for case 2', + folderId: 1, + createdAt: new Date(), + updatedAt: new Date(), + }, + ]); }, down: async (queryInterface, Sequelize) => {