delfakesrc
This commit is contained in:
parent
8032f415dc
commit
1fa3dde153
@ -1,5 +0,0 @@
|
||||
DB_USER=nichtar
|
||||
DB_HOST=postgres
|
||||
DB_NAME=SDR
|
||||
DB_PASSWORD=postgres
|
||||
DB_PORT=5432
|
||||
@ -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 });
|
||||
}
|
||||
};
|
||||
@ -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);
|
||||
}
|
||||
};
|
||||
@ -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;
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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: 'Неверный токен.' });
|
||||
}
|
||||
};
|
||||
@ -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;
|
||||
@ -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}`);
|
||||
});
|
||||
Loading…
x
Reference in New Issue
Block a user