delfakesrc

This commit is contained in:
tarasov-ne 2025-03-22 21:30:42 +03:00
parent 8032f415dc
commit 1fa3dde153
10 changed files with 0 additions and 277 deletions

View File

@ -1,5 +0,0 @@
DB_USER=nichtar
DB_HOST=postgres
DB_NAME=SDR
DB_PASSWORD=postgres
DB_PORT=5432

View File

@ -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<void> => {
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 });
}
};

View File

@ -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);
}
};

View File

@ -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;
}

View File

@ -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
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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: 'Неверный токен.' });
}
};

View File

@ -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;

View File

@ -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}`);
});