From 8a2ca8c56331938c4d36e6f74989d08bb0610088 Mon Sep 17 00:00:00 2001 From: Takeshi Kimata <117462761+kimatata@users.noreply.github.com> Date: Wed, 20 Mar 2024 20:09:06 +0900 Subject: [PATCH] Create Home tab --- backend/index.js | 2 + backend/models/projects.js | 4 ++ backend/routes/projects/show.js | 38 ++++++++++++ .../projects/[projectId]/dashboard/page.tsx | 3 - .../app/projects/[projectId]/home/home.tsx | 59 +++++++++++++++++++ .../app/projects/[projectId]/home/page.tsx | 9 +++ frontend/app/projects/[projectId]/sidebar.tsx | 8 +-- frontend/app/projects/project-card.tsx | 2 +- 8 files changed, 117 insertions(+), 8 deletions(-) create mode 100644 backend/routes/projects/show.js delete mode 100644 frontend/app/projects/[projectId]/dashboard/page.tsx create mode 100644 frontend/app/projects/[projectId]/home/home.tsx create mode 100644 frontend/app/projects/[projectId]/home/page.tsx diff --git a/backend/index.js b/backend/index.js index 90708c3..6fd4225 100644 --- a/backend/index.js +++ b/backend/index.js @@ -29,10 +29,12 @@ app.use("/", indexRoute); // "/projects" const projectsIndexRoute = require("./routes/projects/index")(sequelize); +const projectsShowRoute = require("./routes/projects/show")(sequelize); const projectsNewRoute = require("./routes/projects/new")(sequelize); const projectsEditRoute = require("./routes/projects/edit")(sequelize); const projectsDeleteRoute = require("./routes/projects/delete")(sequelize); app.use("/projects", projectsIndexRoute); +app.use("/projects", projectsShowRoute); app.use("/projects", projectsNewRoute); app.use("/projects", projectsEditRoute); app.use("/projects", projectsDeleteRoute); diff --git a/backend/models/projects.js b/backend/models/projects.js index c9dc6e4..d9cc11e 100644 --- a/backend/models/projects.js +++ b/backend/models/projects.js @@ -10,6 +10,10 @@ function defineProject(sequelize, DataTypes) { }, }); + Project.associate = (models) => { + Project.hasMany(models.Folder, { foreignKey: "projectId" }); + }; + return Project; } diff --git a/backend/routes/projects/show.js b/backend/routes/projects/show.js new file mode 100644 index 0000000..9dcb38c --- /dev/null +++ b/backend/routes/projects/show.js @@ -0,0 +1,38 @@ +const express = require("express"); +const router = express.Router(); +const defineProject = require("../../models/projects"); +const defineFolder = require("../../models/folders"); +const { DataTypes } = require("sequelize"); + +module.exports = function (sequelize) { + const Project = defineProject(sequelize, DataTypes); + const Folder = defineFolder(sequelize, DataTypes); + Project.hasMany(Folder, { foreignKey: "projectId" }); + + router.get("/:projectId", async (req, res) => { + const projectId = req.params.projectId; + + if (!projectId) { + return res.status(400).json({ error: "projectId is required" }); + } + + try { + const project = await Project.findByPk(projectId, { + include: [ + { + model: Folder, + }, + ], + }); + if (!project) { + return res.status(404).send("Project not found"); + } + res.json(project); + } catch (error) { + console.error(error); + res.status(500).send("Internal Server Error"); + } + }); + + return router; +}; diff --git a/frontend/app/projects/[projectId]/dashboard/page.tsx b/frontend/app/projects/[projectId]/dashboard/page.tsx deleted file mode 100644 index 67ef9c9..0000000 --- a/frontend/app/projects/[projectId]/dashboard/page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Page() { - return <>This is Dashboard tab>; -} diff --git a/frontend/app/projects/[projectId]/home/home.tsx b/frontend/app/projects/[projectId]/home/home.tsx new file mode 100644 index 0000000..04581ea --- /dev/null +++ b/frontend/app/projects/[projectId]/home/home.tsx @@ -0,0 +1,59 @@ +"use client"; +import Config from "@/config/config"; +const apiServer = Config.apiServer; +import { useState, useEffect } from "react"; + +async function fetchProject(url) { + try { + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + const data = await response.json(); + return data; + } catch (error) { + console.error("Error fetching data:", error.message); + } +} + +type Props = { + projectId: string; +}; + +export function Home({ projectId }: Props) { + const [project, setProject] = useState({ + Folders: [], + }); + const url = `${apiServer}/projects/${projectId}`; + + useEffect(() => { + async function fetchDataEffect() { + try { + const data = await fetchProject(url); + setProject(data); + console.log(data); + } catch (error) { + console.error("Error in effect:", error.message); + } + } + + fetchDataEffect(); + }, [url]); + + return ( + <> +