From 788c02761d1c66360b4357ec00317e99c58c0019 Mon Sep 17 00:00:00 2001 From: Ivan Titov Date: Fri, 21 Mar 2025 16:05:06 +0300 Subject: [PATCH] save --- database/init/00-users-init.sql | 8 ++--- database/init/01-project-init.sql | 6 ++-- database/init/02-sprint-init.sql | 4 +-- database/init/03-tasks-init.sql | 4 +-- deployments/task-manager.yaml | 2 +- go.sum | 1 + internal/app/handlers.go | 44 ++++++++++++++++++++++--- internal/app/task_manager.go | 5 ++- internal/domain/project/project.go | 4 +-- internal/domain/sprint/sprint.go | 4 +-- internal/domain/tasks/task.go | 18 +++++----- internal/domain/users/user.go | 1 + internal/persistance/task_repository.go | 35 ++++++++++++++++---- internal/persistance/user_repository.go | 9 +++-- 14 files changed, 103 insertions(+), 42 deletions(-) diff --git a/database/init/00-users-init.sql b/database/init/00-users-init.sql index 466bf6d..30aea77 100644 --- a/database/init/00-users-init.sql +++ b/database/init/00-users-init.sql @@ -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 ); \ No newline at end of file diff --git a/database/init/01-project-init.sql b/database/init/01-project-init.sql index 5f2a2ed..7744b63 100644 --- a/database/init/01-project-init.sql +++ b/database/init/01-project-init.sql @@ -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 ); diff --git a/database/init/02-sprint-init.sql b/database/init/02-sprint-init.sql index 46cdd47..86c0093 100644 --- a/database/init/02-sprint-init.sql +++ b/database/init/02-sprint-init.sql @@ -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, diff --git a/database/init/03-tasks-init.sql b/database/init/03-tasks-init.sql index 2f5d21d..009725a 100644 --- a/database/init/03-tasks-init.sql +++ b/database/init/03-tasks-init.sql @@ -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 ); \ No newline at end of file diff --git a/deployments/task-manager.yaml b/deployments/task-manager.yaml index 25e5263..8095619 100644 --- a/deployments/task-manager.yaml +++ b/deployments/task-manager.yaml @@ -1,7 +1,7 @@ version: '3' services: tasks-postgres: - image: postgres:13 + image: docker.io/postgres:13 name: tasks-postgres environment: POSTGRES_USER: postgres diff --git a/go.sum b/go.sum index 50950df..2a964d7 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/internal/app/handlers.go b/internal/app/handlers.go index 886b395..fcf672f 100644 --- a/internal/app/handlers.go +++ b/internal/app/handlers.go @@ -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) { - -} \ No newline at end of file + + 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) {} diff --git a/internal/app/task_manager.go b/internal/app/task_manager.go index 02a9ec3..e3b289f 100644 --- a/internal/app/task_manager.go +++ b/internal/app/task_manager.go @@ -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} -} \ No newline at end of file +} diff --git a/internal/domain/project/project.go b/internal/domain/project/project.go index 035c2c2..364b552 100644 --- a/internal/domain/project/project.go +++ b/internal/domain/project/project.go @@ -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 } diff --git a/internal/domain/sprint/sprint.go b/internal/domain/sprint/sprint.go index 0260882..4125d1e 100644 --- a/internal/domain/sprint/sprint.go +++ b/internal/domain/sprint/sprint.go @@ -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 } diff --git a/internal/domain/tasks/task.go b/internal/domain/tasks/task.go index 7794cb1..aad00c6 100644 --- a/internal/domain/tasks/task.go +++ b/internal/domain/tasks/task.go @@ -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"` } diff --git a/internal/domain/users/user.go b/internal/domain/users/user.go index e6bd68b..f6dfcf6 100644 --- a/internal/domain/users/user.go +++ b/internal/domain/users/user.go @@ -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 } diff --git a/internal/persistance/task_repository.go b/internal/persistance/task_repository.go index ddf9151..098e78e 100644 --- a/internal/persistance/task_repository.go +++ b/internal/persistance/task_repository.go @@ -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 diff --git a/internal/persistance/user_repository.go b/internal/persistance/user_repository.go index a5128e6..5623d05 100644 --- a/internal/persistance/user_repository.go +++ b/internal/persistance/user_repository.go @@ -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