diff --git a/backend/src/.env b/backend/src/.env deleted file mode 100644 index b9a9642..0000000 --- a/backend/src/.env +++ /dev/null @@ -1,5 +0,0 @@ -DB_USER=nichtar -DB_HOST=postgres -DB_NAME=SDR -DB_PASSWORD=postgres -DB_PORT=5432 \ No newline at end of file diff --git a/backend/src/controllers.ts b/backend/src/controllers.ts deleted file mode 100644 index 416f6f0..0000000 --- a/backend/src/controllers.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Request, Response } from 'express'; -import jwt from 'jsonwebtoken'; -import { getRepository } from 'typeorm'; -import { Project } from './entities/Project'; -import { ProjectMember } from './entities/ProjectMember'; -import { Task } from './entities/Task'; -import { User } from './entities/User'; - -const SECRET_KEY = process.env.JWT_SECRET || 'your_secret_key'; - -// Аутентификация пользователя и выдача токена -export const login = async (req: Request, res: Response): Promise => { - const { username, password } = req.body; - const userRepository = getRepository(User); - - try { - const user = await userRepository.findOne({ where: { username } }); - - if (!user || user.password !== password) { - res.status(401).json({ message: 'Неверные имя пользователя или пароль' }); - return; - } - - const token = jwt.sign({ id: user.id, username: user.username }, SECRET_KEY, { expiresIn: '1h' }); - - res.json({ token }); - } catch (error) { - res.status(500).json({ message: 'Ошибка при аутентификации', error }); - } -}; - - -// Создание проекта -export const createProject = async (req: Request, res: Response) => { - const projectRepository = getRepository(Project); - const { title, description } = req.body; - const ownerId = req.user?.id; - - try { - const project = projectRepository.create({ title, description, owner: { id: ownerId } }); - await projectRepository.save(project); - res.status(201).json(project); - } catch (error) { - res.status(500).json({ message: 'Ошибка при создании проекта', error }); - } -}; - -// Получение списка проектов -export const getProjects = async (req: Request, res: Response) => { - const projectRepository = getRepository(Project); - const userId = req.user?.id; - - try { - const projects = await projectRepository.find({ - where: { owner: { id: userId } }, // Ищем проекты, где owner соответствует ID пользователя - relations: ['owner'], // Подгружаем связанные данные о владельце - }); - - res.json(projects); - } catch (error) { - res.status(500).json({ message: 'Ошибка при получении проектов', error }); - } -}; - -// Добавление участника в проект -export const addMemberToProject = async (req: Request, res: Response) => { - const memberRepository = getRepository(ProjectMember); - const { projectId } = req.params; - const { userId, role } = req.body; - - try { - const member = memberRepository.create({ project: { id: Number(projectId) }, user: { id: userId }, role }); - await memberRepository.save(member); - res.status(201).json({ message: 'Участник добавлен в проект' }); - } catch (error) { - res.status(500).json({ message: 'Ошибка при добавлении участника', error }); - } -}; - -// Создание задачи -export const createTask = async (req: Request, res: Response) => { - const taskRepository = getRepository(Task); - const { projectId } = req.params; - const { title, status, assignedUserId, deadline } = req.body; - - try { - const task = taskRepository.create({ - project: { id: Number(projectId) }, - title, - status, - assigned_user: assignedUserId ? { id: assignedUserId } : null, - deadline, - }); - await taskRepository.save(task); - res.status(201).json(task); - } catch (error) { - res.status(500).json({ message: 'Ошибка при создании задачи', error }); - } -}; - -// Получение списка задач по проекту -export const getTasksByProject = async (req: Request, res: Response) => { - const taskRepository = getRepository(Task); - const { projectId } = req.params; - - try { - const tasks = await taskRepository.find({ where: { project: { id: Number(projectId) } } }); - res.json(tasks); - } catch (error) { - res.status(500).json({ message: 'Ошибка при получении задач', error }); - } -}; diff --git a/backend/src/db.ts b/backend/src/db.ts deleted file mode 100644 index 2667608..0000000 --- a/backend/src/db.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { createConnection } from 'typeorm'; - -export const connectDB = async () => { - try { - await createConnection(); - console.log('База данных подключена'); - } catch (error) { - console.error('Ошибка подключения к базе данных:', error); - process.exit(1); - } -}; diff --git a/backend/src/entities/Project.ts b/backend/src/entities/Project.ts deleted file mode 100644 index 6dfc7ef..0000000 --- a/backend/src/entities/Project.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, CreateDateColumn, UpdateDateColumn } from 'typeorm'; -import { User } from './User'; - -@Entity('projects') -export class Project { - @PrimaryGeneratedColumn() - id!: number; - - @Column() - title!: string; - - @Column({ nullable: true }) - description!: string; - - @ManyToOne(() => User, (user) => user.id) - owner!: User; - - @CreateDateColumn() - created_at!: Date; - - @UpdateDateColumn() - updated_at!: Date; -} diff --git a/backend/src/entities/ProjectMember.ts b/backend/src/entities/ProjectMember.ts deleted file mode 100644 index b7810d6..0000000 --- a/backend/src/entities/ProjectMember.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, ManyToOne, Column } from 'typeorm'; -import { Project } from './Project'; -import { User } from './User'; - -@Entity('project_members') -export class ProjectMember { - @PrimaryGeneratedColumn() - id!: number; - - @ManyToOne(() => Project, (project) => project.id) - project!: Project; - - @ManyToOne(() => User, (user) => user.id) - user!: User; - - @Column() - role!: string; // Возможные значения: owner, member -} diff --git a/backend/src/entities/Task.ts b/backend/src/entities/Task.ts deleted file mode 100644 index cd336d3..0000000 --- a/backend/src/entities/Task.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, CreateDateColumn } from 'typeorm'; -import { Project } from './Project'; -import { User } from './User'; - -@Entity('tasks') -export class Task { - @PrimaryGeneratedColumn() - id!: number; - - @Column() - title!: string; - - @Column({ default: 'todo' }) - status!: string; - - @ManyToOne(() => Project, (project) => project.id) - project!: Project; - - @ManyToOne(() => User, (user) => user.id, { nullable: true }) - assigned_user!: User | null; - - @Column({ type: 'timestamp', nullable: true }) - deadline!: Date | null; - - @CreateDateColumn() - created_at!: Date; -} - diff --git a/backend/src/entities/User.ts b/backend/src/entities/User.ts deleted file mode 100644 index 1f7926f..0000000 --- a/backend/src/entities/User.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm'; - -@Entity('users') -export class User { - @PrimaryGeneratedColumn() - id!: number; - - @Column({ unique: true }) - username!: string; - - @Column({ unique: true }) - email!: string; - - @Column() - password!: string; - - @CreateDateColumn() - created_at!: Date; -} diff --git a/backend/src/middlewares.ts b/backend/src/middlewares.ts deleted file mode 100644 index c4b7b7e..0000000 --- a/backend/src/middlewares.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; -import jwt from 'jsonwebtoken'; - -const SECRET_KEY = process.env.JWT_SECRET || 'your_secret_key'; - -export const verifyToken = (req: Request, res: Response, next: NextFunction): void => { - const token = req.header('Authorization')?.replace('Bearer ', ''); - - if (!token) { - res.status(401).json({ message: 'Доступ запрещён. Токен отсутствует.' }); - return; - } - - try { - const decoded = jwt.verify(token, SECRET_KEY) as { id: number; username: string }; - req.user = decoded; // Добавляем `user` в `req` - next(); // Передаём управление следующему middleware - } catch (error) { - res.status(401).json({ message: 'Неверный токен.' }); - } -}; diff --git a/backend/src/routes.ts b/backend/src/routes.ts deleted file mode 100644 index e5798ba..0000000 --- a/backend/src/routes.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Router } from 'express'; -import { login, createProject, getProjects, addMemberToProject, createTask, getTasksByProject } from './controllers'; -import { verifyToken } from './middlewares'; - - -const router = Router(); - -router.post('/login', login); // Новый маршрут для получения токена - -// Проекты -router.post('/projects', verifyToken, createProject); -router.get('/projects', verifyToken, getProjects); -router.post('/projects/:projectId/members', verifyToken, addMemberToProject); - -// Задачи -router.post('/projects/:projectId/tasks', verifyToken, createTask); -router.get('/projects/:projectId/tasks', verifyToken, getTasksByProject); - -export default router; diff --git a/backend/src/server.ts b/backend/src/server.ts deleted file mode 100644 index 3d0aeed..0000000 --- a/backend/src/server.ts +++ /dev/null @@ -1,21 +0,0 @@ -import express, { Application } from 'express'; -import dotenv from 'dotenv'; -import { connectDB } from './db'; -import userRoutes from './routes'; -import cors from 'cors'; - -dotenv.config(); - -const app: Application = express(); -const PORT = process.env.PORT || 3000; - -app.use(cors()); -app.use(express.json()); - -connectDB(); - -app.use('/api', userRoutes); - -app.listen(PORT, () => { - console.log(`Сервер запущен на http://localhost:${PORT}`); -});