This commit is contained in:
Ivan Titov 2025-03-21 16:05:06 +03:00
parent 102413daaf
commit 788c02761d
14 changed files with 103 additions and 42 deletions

View File

@ -7,9 +7,9 @@ CREATE DATABASE tasks;
CREATE SCHEMA task_manager;
CREATE TABLE "user" (
"id" SERIAL PRIMARY KEY,
"login" TEXT NOT NULL,
CREATE TABLE task_manager.user(
"id" SERIAL PRIMARY KEY UNIQUE,
"login" TEXT NOT NULL UNIQUE,
"password" TEXT NOT NULL,
"email" TEXT NOT NULL
"email" TEXT NOT NULL UNIQUE
);

View File

@ -3,7 +3,7 @@
CREATE TABLE task_manager.project (
"id" SERIAL PRIMARY KEY,
"id" SERIAL PRIMARY KEY UNIQUE,
"name" TEXT NOT NULL,
"description" TEXT NOT NULL,
"date" TEXT NOT NULL
@ -13,6 +13,6 @@ CREATE TABLE task_manager.user_project (
"users" INTEGER NOT NULL,
"projects" INTEGER NOT NULL,
PRIMARY KEY ("users", "projects"),
FOREIGN KEY ("projects") REFERENCES "project" ("id") ON DELETE CASCADE,
FOREIGN KEY ("users") REFERENCES "user" ("id") ON DELETE CASCADE
FOREIGN KEY ("projects") REFERENCES task_manager.project ("id") ON DELETE CASCADE,
FOREIGN KEY ("users") REFERENCES task_manager.user ("id") ON DELETE CASCADE
);

View File

@ -2,9 +2,9 @@
\connect tasks;
CREATE TABLE task_manager.sprint(
"id" SERIAL PRIMARY KEY,
"id" SERIAL PRIMARY KEY UNIQUE,
"id_project" INTEGER NOT NULL,
"name" TEXT NOT NULL,
"name" TEXT NOT NULL UNIQUE,
"description" TEXT NOT NULL,
"date" TEXT NOT NULL,
"duration" INTEGER,

View File

@ -4,7 +4,7 @@
CREATE TYPE task_manager.task_status AS ENUM('todo','in_progress','paused','test','review','done');
CREATE TABLE task_manager.task(
"id" SERIAL PRIMARY KEY,
"id" SERIAL PRIMARY KEY UNIQUE,
"id_sprint" INTEGER NOT NULL,
"id_user" INTEGER,
"id_project" INTEGER NOT NULL,
@ -13,7 +13,7 @@ CREATE TABLE task_manager.task(
"date_start" DATE DEFAULT now(),
"duration" INTEGER,
"status" task_manager.task_status DEFAULT 'todo',
FOREIGN KEY (id_user) REFERENCES task_manager.users(id) ON DELETE SET NULL,
FOREIGN KEY (id_user) REFERENCES task_manager.user(id) ON DELETE SET NULL,
FOREIGN KEY (id_sprint) REFERENCES task_manager.sprint(id) ON DELETE SET NULL,
FOREIGN KEY (id_project) REFERENCES task_manager.project(id) ON DELETE CASCADE
);

View File

@ -1,7 +1,7 @@
version: '3'
services:
tasks-postgres:
image: postgres:13
image: docker.io/postgres:13
name: tasks-postgres
environment:
POSTGRES_USER: postgres

1
go.sum
View File

@ -1,3 +1,4 @@
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=

View File

@ -1,14 +1,50 @@
package app
import (
"net/http"
gorilla "github.com/gorilla/mux"
)
const (
api_version string = "/api/v1"
)
type ErrorResponse struct {
Code int `json:"code"` // Http code
Message string `json:"message"` // Обычный текст ошибки
Error string `json:"error"` // Машинный текст ошибки
}
func (rm *TaskManager) RegisterRoutes(router *gorilla.Router) {
}
router.HandleFunc(api_version+"/user/login", rm.handleLogin).Methods(http.MethodPost)
router.HandleFunc(api_version+"/user/register", rm.handleRegistrateUser).Methods(http.MethodPost)
router.HandleFunc(api_version+"/user/tasks", rm.handleUserTasks).Methods(http.MethodGet)
router.HandleFunc(api_version+"/user/projects", rm.handleUserProjects).Methods(http.MethodGet)
router.HandleFunc(api_version+"/user/projects", rm.handleAssignUserToProject).Methods(http.MethodPost)
router.HandleFunc(api_version+"/projects", rm.handleCreateProject).Methods(http.MethodPost)
router.HandleFunc(api_version+"/projects", rm.handleGetProjects).Methods(http.MethodGet)
router.HandleFunc(api_version+"/projects/tasks", rm.handleCreateTask).Methods(http.MethodPost)
router.HandleFunc(api_version+"/projects/tasks/{task_id}", rm.handleUpdateTask).Methods(http.MethodPatch)
router.HandleFunc(api_version+"/projects/sprints", rm.handleCreateSprint).Methods(http.MethodPost)
router.HandleFunc(api_version+"/projects/users", rm.handleGetProjectUsers).Methods(http.MethodGet)
}
func (rm *TaskManager) handleLogin(w http.ResponseWriter, r *http.Request) {}
func (rm *TaskManager) handleRegistrateUser(w http.ResponseWriter, r *http.Request) {}
func (rm *TaskManager) handleUserTasks(w http.ResponseWriter, r *http.Request) {}
func (rm *TaskManager) handleUserProjects(w http.ResponseWriter, r *http.Request) {}
func (rm *TaskManager) handleAssignUserToProject(w http.ResponseWriter, r *http.Request) {}
func (rm *TaskManager) handleCreateProject(w http.ResponseWriter, r *http.Request) {}
func (rm *TaskManager) handleCreateTask(w http.ResponseWriter, r *http.Request) {}
func (rm *TaskManager) handleCreateSprint(w http.ResponseWriter, r *http.Request) {}
func (rm *TaskManager) handleGetProjectUsers(w http.ResponseWriter, r *http.Request) {}
func (rm *TaskManager) handleUpdateTask(w http.ResponseWriter, r *http.Request) {}
func (rm *TaskManager) handleGetProjects(w http.ResponseWriter, r *http.Request) {}

View File

@ -4,11 +4,10 @@ import (
"task_manager/internal/persistance"
)
type TaskManager {
type TaskManager struct {
repo *persistance.TaskManagerRepository
}
func NewTaskManager(newRepo *persistance.TaskManagerRepository) *TaskManager {
return &TaskManager{repo: newRepo}
}
}

View File

@ -1,11 +1,11 @@
package project
import "task_manager/internal/domain/stprint"
import "task_manager/internal/domain/sprint"
type Project struct {
Id int `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Date string `json:"date"`
Sprints []stprint.Sprint
Sprints []sprint.Sprint
}

View File

@ -1,6 +1,6 @@
package sprint
import "task_manager/internal/domain/task"
import "task_manager/internal/domain/tasks"
type Sprint struct {
Id int `json:"id"`
@ -9,5 +9,5 @@ type Sprint struct {
Description string `json:"description"`
Date string `json:"date"`
Duration int `json:"duration"`
Tasks []task.Task
Tasks []tasks.Task
}

View File

@ -1,13 +1,13 @@
package tasks
type Task struct {
Id int `json:"id"`
IdUser int `json:"id_user"`
IdSprint int `json:"id_sprint"`
IdProject int `json:"id_project"`
Name string `json:"title"`
Description string `json:"desrciption"`
DateStart string `jsong:"date_start"`
Status string `json:"status"`
Duration int `json:"duration"`
Id int `json:"id"`
IdUser *int `json:"id_user"`
IdSprint *int `json:"id_sprint"`
IdProject int `json:"id_project"`
Title string `json:"title"`
Description *string `json:"desrciption"`
DateStart string `jsong:"date_start"`
Status string `json:"status"`
Duration *int `json:"duration"`
}

View File

@ -6,5 +6,6 @@ type User struct {
Id int `json:"id"`
Name string `json:"name"`
Password string `json:"password"`
Email string `json:"email"`
Projects []project.Project
}

View File

@ -8,7 +8,16 @@ import (
)
func (tm *TaskManagerRepository) AddTask(task tasks.Task) error {
err := tm.db.QueryRow("INSERT INTO task_manager.tasks(name, description) VALUES($1,$2) RETURNING id", task.Name, task.Description).Scan(&task.Id)
err := tm.db.QueryRow(`INSERT INTO task_manager.tasks(id_sprint,id_user,id_project,title,description,duration,status)
VALUES($1,$2,$3,$4,$5,$6,$7)
RETURNING id`,
task.IdSprint,
task.IdUser,
task.IdProject,
task.Title,
task.Description,
task.Duration,
task.Status).Scan(&task.Id)
if err != nil {
return err
}
@ -16,7 +25,12 @@ func (tm *TaskManagerRepository) AddTask(task tasks.Task) error {
}
func (tm *TaskManagerRepository) UpdateTask(task tasks.Task) error {
_, err := tm.db.Exec("UPDATE task_manager.tasks SET name=$1, description=$2, id_user=$3, status=$4 WHERE id=$3", task.Name, task.Description, task.IdUser, task.Status)
_, err := tm.db.Exec(`UPDATE task_manager.tasks
SET name=$1,
description=$2,
id_user=$3,
status=$4
WHERE id=$3`, task.Title, task.Description, task.IdUser, task.Status)
if err != nil {
return err
}
@ -33,8 +47,16 @@ func (tm *TaskManagerRepository) DeleteTask(task tasks.Task) error {
func (tm *TaskManagerRepository) GetTask(id int) (*tasks.Task, error) {
task := tasks.Task{}
row := tm.db.QueryRow("SELECT (id,id_user,name,description,status,creation_date,update_date) FROM task_manager.tasks WHERE id=$1", id)
err := row.Scan(task.Id, task.IdUser, task.Name, task.Description, task.Status, task.CreationDate, task.UpdateDate)
row := tm.db.QueryRow("SELECT (id,id_sprint,id_user,id_project,title,description,date_start,duration,status) FROM task_manager.tasks WHERE id=$1", id)
err := row.Scan(&task.Id,
&task.IdSprint,
&task.IdUser,
&task.IdProject,
&task.Title,
&task.Description,
&task.DateStart,
&task.Duration,
&task.Status)
if err != nil {
log.Println("Ошибка получения пользователя:", err)
return nil, err
@ -55,11 +77,10 @@ func (tm *TaskManagerRepository) GetUserTasks(id_user int) ([]tasks.Task, error)
task := tasks.Task{}
err = rows.Scan(&task.Id,
&task.IdUser,
&task.Name,
&task.Title,
&task.Description,
&task.Status,
&task.CreationDate,
&task.UpdateDate,
&task.DateStart,
)
if err != nil {
return user_tasks, err

View File

@ -8,7 +8,10 @@ import (
)
func (tm *TaskManagerRepository) AddUser(user *users.User) error {
err := tm.db.QueryRow("INSERT INTO task_manager.users(name, password) VALUES($1,$2) RETURNING id", user.Name, GetMD5Hash(user.Password)).Scan(&user.Id)
err := tm.db.QueryRow("INSERT INTO task_manager.users(name, password, email) VALUES($1,$2,$3) RETURNING id",
user.Name,
GetMD5Hash(user.Password),
user.Email).Scan(&user.Id)
if err != nil {
return err
}
@ -33,8 +36,8 @@ func (tm *TaskManagerRepository) UpdateUser(user *users.User) error {
func (tm *TaskManagerRepository) GetUser(user_name string) (*users.User, error) {
user := users.User{}
row := tm.db.QueryRow("SELECT (id,name,password) FROM task_manager.users WHERE name=$1", user_name)
err := row.Scan(user.Id, user.Name, user.Password)
row := tm.db.QueryRow("SELECT (id,name,password,email) FROM task_manager.users WHERE name=$1", user_name)
err := row.Scan(&user.Id, &user.Name, &user.Password, &user.Email)
if err != nil {
log.Println("Ошибка получения пользователя:", err)
return nil, err