From afb58585fa230e74adaf3914c7fa06a8a610eb45 Mon Sep 17 00:00:00 2001 From: Takeshi Kimata <117462761+kimatata@users.noreply.github.com> Date: Sat, 16 Mar 2024 21:14:59 +0900 Subject: [PATCH] create attachment file table --- backend/.gitignore | 1 + backend/index.js | 4 ++ .../20240316200815-create-attachments.js | 38 ++++++++++++++ ...20240316201158-create-cases-attachments.js | 48 ++++++++++++++++++ backend/models/attachments.js | 26 ++++++++++ backend/models/caseAttachments.js | 27 ++++++++++ backend/public/sample/861px-Selenium_Logo.png | Bin 0 -> 57217 bytes backend/public/sample/logo-shadow.svg | 24 +++++++++ backend/routes/cases/index.js | 21 +++++--- backend/seeders/seed.js | 32 ++++++++++++ .../cases/[caseId]/attachments-editor.tsx | 35 +++++++++++++ .../[folderId]/cases/[caseId]/page.tsx | 23 +++++++++ 12 files changed, 273 insertions(+), 6 deletions(-) create mode 100644 backend/migrations/20240316200815-create-attachments.js create mode 100644 backend/migrations/20240316201158-create-cases-attachments.js create mode 100644 backend/models/attachments.js create mode 100644 backend/models/caseAttachments.js create mode 100644 backend/public/sample/861px-Selenium_Logo.png create mode 100644 backend/public/sample/logo-shadow.svg create mode 100644 frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/attachments-editor.tsx diff --git a/backend/.gitignore b/backend/.gitignore index 3fa91ea..de5fee4 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1,3 +1,4 @@ node_modules/ .env database.sqlite +public/uploads/ diff --git a/backend/index.js b/backend/index.js index b1f14c8..b5d3a9d 100644 --- a/backend/index.js +++ b/backend/index.js @@ -1,4 +1,5 @@ const express = require("express"); +const path = require('path'); const { Sequelize } = require("sequelize"); const app = express(); @@ -13,6 +14,9 @@ app.use(cors(corsOptions)); // enable json middleware app.use(express.json()); +// Specify the directory to serve static files +app.use(express.static(path.join(__dirname, "public"))); + // init sequalize const sequelize = new Sequelize({ dialect: "sqlite", diff --git a/backend/migrations/20240316200815-create-attachments.js b/backend/migrations/20240316200815-create-attachments.js new file mode 100644 index 0000000..489f59c --- /dev/null +++ b/backend/migrations/20240316200815-create-attachments.js @@ -0,0 +1,38 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + await queryInterface.createTable('attachments', { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + }, + title: { + type: Sequelize.STRING, + allowNull: false, + }, + detail: { + type: Sequelize.STRING, + allowNull: true, + }, + path: { + type: Sequelize.STRING, + allowNull: false, + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + + async down (queryInterface, Sequelize) { + await queryInterface.dropTable('attachments'); + } +}; diff --git a/backend/migrations/20240316201158-create-cases-attachments.js b/backend/migrations/20240316201158-create-cases-attachments.js new file mode 100644 index 0000000..96b7c73 --- /dev/null +++ b/backend/migrations/20240316201158-create-cases-attachments.js @@ -0,0 +1,48 @@ +"use strict"; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + up: async (queryInterface, Sequelize) => { + await queryInterface.createTable("caseAttachments", { + id: { + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + }, + caseId: { + type: Sequelize.INTEGER, + references: { + model: "cases", + key: "id", + }, + onUpdate: "CASCADE", + onDelete: "CASCADE", + }, + attachmentId: { + type: Sequelize.INTEGER, + references: { + model: "attachments", + key: "id", + }, + onUpdate: "CASCADE", + onDelete: "CASCADE", + }, + createdAt: { + type: Sequelize.DATE, + allowNull: false, + }, + updatedAt: { + type: Sequelize.DATE, + allowNull: false, + }, + }); + + await queryInterface.addIndex("caseAttachments", ["caseId", "attachmentId"], { + unique: true, + }); + }, + + down: async (queryInterface, Sequelize) => { + await queryInterface.dropTable("caseAttachments"); + }, +}; diff --git a/backend/models/attachments.js b/backend/models/attachments.js new file mode 100644 index 0000000..92ca26d --- /dev/null +++ b/backend/models/attachments.js @@ -0,0 +1,26 @@ +function defineAttachment(sequelize, DataTypes) { + const Attachment = sequelize.define("Attachment", { + title: { + type: DataTypes.STRING, + allowNull: false, + }, + detail: { + type: DataTypes.STRING, + allowNull: true, + }, + path: { + type: DataTypes.STRING, + allowNull: false, + }, + }); + + Attachment.associate = (models) => { + Attachment.belongsToMany(models.Case, { + through: "caseAttachments" + }); + }; + + return Attachment; +} + +module.exports = defineAttachment; diff --git a/backend/models/caseAttachments.js b/backend/models/caseAttachments.js new file mode 100644 index 0000000..898565f --- /dev/null +++ b/backend/models/caseAttachments.js @@ -0,0 +1,27 @@ +function defineCaseAttachment(sequelize, DataTypes) { + const CaseAttachment = sequelize.define("CaseAttachment", { + caseId: { + type: DataTypes.INTEGER, + allowNull: false, + }, + attachmentId: { + type: DataTypes.INTEGER, + allowNull: false, + }, + }); + + CaseAttachment.associate = (models) => { + CaseAttachment.belongsTo(models.Case, { + foreignKey: "caseId", + onDelete: "CASCADE", + }); + CaseAttachment.belongsTo(models.Attachment, { + foreignKey: "attachmentId", + onDelete: "CASCADE", + }); + }; + + return CaseAttachment; +} + +module.exports = defineCaseAttachment; diff --git a/backend/public/sample/861px-Selenium_Logo.png b/backend/public/sample/861px-Selenium_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9f4242cebf93f8f2d723290fc5cf97342b0cc54f GIT binary patch literal 57217 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 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/routes/cases/index.js b/backend/routes/cases/index.js index 64bdd40..9e1050b 100644 --- a/backend/routes/cases/index.js +++ b/backend/routes/cases/index.js @@ -2,13 +2,17 @@ const express = require("express"); const router = express.Router(); const defineCase = require("../../models/cases"); const defineStep = require("../../models/steps"); +const defineAttachment = require("../../models/attachments"); const { DataTypes } = require("sequelize"); module.exports = function (sequelize) { const Case = defineCase(sequelize, DataTypes); const Step = defineStep(sequelize, DataTypes); - Case.belongsToMany(Step, { through: 'caseSteps' }); - Step.belongsToMany(Case, { through: 'caseSteps' }); + const Attachment = defineAttachment(sequelize, DataTypes); + Case.belongsToMany(Step, { through: "caseSteps" }); + Step.belongsToMany(Case, { through: "caseSteps" }); + Case.belongsToMany(Attachment, { through: "caseAttachments" }); + Attachment.belongsToMany(Case, { through: "caseAttachments" }); router.get("/", async (req, res) => { const { caseId, folderId } = req.query; @@ -20,10 +24,15 @@ module.exports = function (sequelize) { if (caseId) { // Include steps if requested using caseId const testcase = await Case.findByPk(caseId, { - include: [{ - model: Step, - through: { attributes: ['stepNo'] }, - }], + include: [ + { + model: Step, + through: { attributes: ["stepNo"] }, + }, + { + model: Attachment, + }, + ], }); return res.json(testcase); } diff --git a/backend/seeders/seed.js b/backend/seeders/seed.js index 635f57d..dc50257 100644 --- a/backend/seeders/seed.js +++ b/backend/seeders/seed.js @@ -174,6 +174,38 @@ module.exports = { updatedAt: new Date(), }, ]); + + await queryInterface.bulkInsert("attachments", [ + { + title: "Selenium logo", + detail: "", + path: "http://localhost:3001/sample/861px-Selenium_Logo.png", + createdAt: new Date(), + updatedAt: new Date(), + }, + { + title: "vitest logo", + detail: "", + path: "http://localhost:3001/sample/logo-shadow.svg", + createdAt: new Date(), + updatedAt: new Date(), + } + ]); + + await queryInterface.bulkInsert("caseAttachments", [ + { + caseId: 1, + attachmentId: 1, + createdAt: new Date(), + updatedAt: new Date(), + }, + { + caseId: 1, + attachmentId: 2, + createdAt: new Date(), + updatedAt: new Date(), + } + ]); }, down: async (queryInterface, Sequelize) => { diff --git a/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/attachments-editor.tsx b/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/attachments-editor.tsx new file mode 100644 index 0000000..8b3aa04 --- /dev/null +++ b/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/attachments-editor.tsx @@ -0,0 +1,35 @@ +import { Image, Button, Tooltip } from "@nextui-org/react"; +import { AttachmentType } from "./page"; +import { Trash } from "lucide-react"; + +type Props = { + attachments: AttachmentType[]; + onAttachmentDelete: (attachmentId: number) => void; +}; + +export default function AttachmentsEditor({ + attachments = [], + onAttachmentDelete, +}: Props) { + return ( + <> + {attachments.map((attachment, index) => ( +
+ {attachment.title} +
+ + + +
+
+ ))} + + ); +} diff --git a/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/page.tsx b/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/page.tsx index 9cf6c6a..5ad979e 100644 --- a/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/page.tsx +++ b/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/page.tsx @@ -12,6 +12,7 @@ import { import { Plus, ArrowUpFromLine } from "lucide-react"; import { priorities, testTypes, templates } from "@/config/selection"; import StepsEditor from "./steps-editor"; +import AttachmentsEditor from "./attachments-editor"; import Config from "@/config/config"; const apiServer = Config.apiServer; @@ -28,6 +29,7 @@ type CaseType = { expectedResults: string; folderId: number; Steps: StepType[]; + Attachments: AttachmentType[]; }; type CaseStepType = { @@ -46,6 +48,23 @@ export type StepType = { caseSteps: CaseStepType; }; +type CaseAttachmentType = { + createdAt: Date; + updatedAt: Date; + CaseId: number; + AttachmentId: number; +}; + +export type AttachmentType = { + id: number; + title: string; + detail: string; + path: string; + createdAt: Date; + updatedAt: Date; + caseSteps: CaseAttachmentType; +}; + const defaultTestCase = { id: 0, title: "", @@ -411,6 +430,10 @@ export default function Page({
Attachments
+ console.log(id)} + />