diff --git a/database/init/00-users-init.sql b/database/init/00-users-init.sql index 29ae8c6..466bf6d 100644 --- a/database/init/00-users-init.sql +++ b/database/init/00-users-init.sql @@ -6,9 +6,10 @@ CREATE DATABASE tasks; CREATE SCHEMA task_manager; -CREATE TABLE task_manager.users( - id serial PRIMARY KEY NOT NULL UNIQUE, - login TEXT NOT NULL UNIQUE, - password TEXT NOT NULL -); +CREATE TABLE "user" ( + "id" SERIAL PRIMARY KEY, + "login" TEXT NOT NULL, + "password" TEXT NOT NULL, + "email" TEXT NOT NULL +); \ No newline at end of file diff --git a/database/init/01-project-init.sql b/database/init/01-project-init.sql new file mode 100644 index 0000000..5f2a2ed --- /dev/null +++ b/database/init/01-project-init.sql @@ -0,0 +1,18 @@ + +\connect tasks; + + +CREATE TABLE task_manager.project ( + "id" SERIAL PRIMARY KEY, + "name" TEXT NOT NULL, + "description" TEXT NOT NULL, + "date" TEXT NOT NULL +); + +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 +); diff --git a/database/init/01-tasks-init.sql b/database/init/01-tasks-init.sql deleted file mode 100644 index 7587160..0000000 --- a/database/init/01-tasks-init.sql +++ /dev/null @@ -1,15 +0,0 @@ --- подключаемся к базе данных -\connect tasks; - -CREATE TYPE task_manager.task_status AS ENUM('todo','in_progress','paused','test','review','done'); - -CREATE TABLE IF NOT EXISTS task_manager.tasks( - id serial PRIMARY KEY NOT NULL UNIQUE, - id_user integer, - name TEXT NOT NULL, - description TEXT, - status task_manager.task_status NOT NULL default 'todo', - creation_date date NOT NULL default Now(), - update_date date NOT NULL default Now(), - FOREIGN KEY (id_user) REFERENCES task_manager.users (id) ON DELETE CASCADE -); diff --git a/database/init/02-sprint-init.sql b/database/init/02-sprint-init.sql new file mode 100644 index 0000000..46cdd47 --- /dev/null +++ b/database/init/02-sprint-init.sql @@ -0,0 +1,12 @@ + +\connect tasks; + +CREATE TABLE task_manager.sprint( + "id" SERIAL PRIMARY KEY, + "id_project" INTEGER NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT NOT NULL, + "date" TEXT NOT NULL, + "duration" INTEGER, + FOREIGN KEY (id_project) REFERENCES task_manager.project(id) ON DELETE CASCADE +); \ No newline at end of file diff --git a/database/init/03-tasks-init.sql b/database/init/03-tasks-init.sql new file mode 100644 index 0000000..2f5d21d --- /dev/null +++ b/database/init/03-tasks-init.sql @@ -0,0 +1,19 @@ +-- подключаемся к базе данных +\connect tasks; + +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_sprint" INTEGER NOT NULL, + "id_user" INTEGER, + "id_project" INTEGER NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT NOT NULL, + "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_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/go.mod b/go.mod index 7a20dee..65296cd 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module task_manager -go 1.24 +go 1.19 require ( - github.com/go-chi/chi/v5 v5.2.1 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/lib/pq v1.10.9 // indirect ) diff --git a/go.sum b/go.sum index 8aae7a1..50950df 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,3 @@ -github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8= -github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +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/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= diff --git a/internal/app/handlers.go b/internal/app/handlers.go new file mode 100644 index 0000000..886b395 --- /dev/null +++ b/internal/app/handlers.go @@ -0,0 +1,14 @@ +package app + + +import ( + + "net/http" + gorilla "github.com/gorilla/mux" +) + + + +func (rm *TaskManager) RegisterRoutes(router *gorilla.Router) { + +} \ No newline at end of file diff --git a/internal/app/task_manager.go b/internal/app/task_manager.go new file mode 100644 index 0000000..02a9ec3 --- /dev/null +++ b/internal/app/task_manager.go @@ -0,0 +1,14 @@ +package app + +import ( + "task_manager/internal/persistance" +) + + +type TaskManager { + 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 new file mode 100644 index 0000000..035c2c2 --- /dev/null +++ b/internal/domain/project/project.go @@ -0,0 +1,11 @@ +package project + +import "task_manager/internal/domain/stprint" + +type Project struct { + Id int `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + Date string `json:"date"` + Sprints []stprint.Sprint +} diff --git a/internal/domain/sprint/sprint.go b/internal/domain/sprint/sprint.go new file mode 100644 index 0000000..0260882 --- /dev/null +++ b/internal/domain/sprint/sprint.go @@ -0,0 +1,13 @@ +package sprint + +import "task_manager/internal/domain/task" + +type Sprint struct { + Id int `json:"id"` + Id_project int `json:"id_project"` + Name string `json:"name"` + Description string `json:"description"` + Date string `json:"date"` + Duration int `json:"duration"` + Tasks []task.Task +} diff --git a/internal/domain/tasks/task.go b/internal/domain/tasks/task.go index 0781c2b..7794cb1 100644 --- a/internal/domain/tasks/task.go +++ b/internal/domain/tasks/task.go @@ -1,11 +1,13 @@ package tasks type Task struct { - Id int `json:"id"` - IdUser int `json:"id_user"` - Name string `json:"name"` - Description string `json:"desrciption"` - Status string `json:"status"` - CreationDate string `json:"creation_date"` - UpdateDate string `json:"update_date"` + 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"` } diff --git a/internal/domain/users/user.go b/internal/domain/users/user.go index a161b5c..e6bd68b 100644 --- a/internal/domain/users/user.go +++ b/internal/domain/users/user.go @@ -1,10 +1,10 @@ package users -import "task_manager/internal/domain/tasks" +import "task_manager/internal/domain/project" type User struct { Id int `json:"id"` Name string `json:"name"` Password string `json:"password"` - Tasks []tasks.Task + Projects []project.Project } diff --git a/internal/persistance/task_manager.go b/internal/persistance/task_manager_repository.go similarity index 60% rename from internal/persistance/task_manager.go rename to internal/persistance/task_manager_repository.go index 1c37c66..6f26679 100644 --- a/internal/persistance/task_manager.go +++ b/internal/persistance/task_manager_repository.go @@ -6,12 +6,12 @@ import ( "encoding/hex" ) -type TaskManager struct { +type TaskManagerRepository struct { db *sql.DB } -func NewTaskManager(db *sql.DB) *TaskManager { - return &TaskManager{db: db} +func NewTaskManager(db *sql.DB) *TaskManagerRepository { + return &TaskManagerRepository{db: db} } func GetMD5Hash(text string) string { diff --git a/internal/persistance/task_repository.go b/internal/persistance/task_repository.go index d699917..ddf9151 100644 --- a/internal/persistance/task_repository.go +++ b/internal/persistance/task_repository.go @@ -7,7 +7,7 @@ import ( _ "github.com/lib/pq" ) -func (tm *TaskManager) AddTask(task tasks.Task) error { +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) if err != nil { return err @@ -15,7 +15,7 @@ func (tm *TaskManager) AddTask(task tasks.Task) error { return nil } -func (tm *TaskManager) UpdateTask(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) if err != nil { return err @@ -23,7 +23,7 @@ func (tm *TaskManager) UpdateTask(task tasks.Task) error { return nil } -func (tm *TaskManager) DeleteTask(task tasks.Task) error { +func (tm *TaskManagerRepository) DeleteTask(task tasks.Task) error { _, err := tm.db.Exec("DELETE FROM task_manager.tasks WHERE id=$1", task.Id) if err != nil { return err @@ -31,7 +31,7 @@ func (tm *TaskManager) DeleteTask(task tasks.Task) error { return nil } -func (tm *TaskManager) GetTask(id int) (*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) @@ -43,7 +43,7 @@ func (tm *TaskManager) GetTask(id int) (*tasks.Task, error) { return &task, nil } -func (tm *TaskManager) GetUserTasks(id_user int) ([]tasks.Task, error) { +func (tm *TaskManagerRepository) GetUserTasks(id_user int) ([]tasks.Task, error) { user_tasks := []tasks.Task{} rows, err := tm.db.Query("SELECT (id,id_user,name,description,status,creation_date,update_date) FROM task_manager.tasks WHERE id_user=$1", id_user) diff --git a/internal/persistance/user_repository.go b/internal/persistance/user_repository.go index 4d115d6..a5128e6 100644 --- a/internal/persistance/user_repository.go +++ b/internal/persistance/user_repository.go @@ -7,7 +7,7 @@ import ( _ "github.com/lib/pq" ) -func (tm *TaskManager) AddUser(user *users.User) error { +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) if err != nil { return err @@ -15,7 +15,7 @@ func (tm *TaskManager) AddUser(user *users.User) error { return nil } -func (tm *TaskManager) DeleteUser(user *users.User) error { +func (tm *TaskManagerRepository) DeleteUser(user *users.User) error { _, err := tm.db.Exec("DELETE FROM task_manager.users WHERE name=$1", user.Name) if err != nil { return err @@ -23,7 +23,7 @@ func (tm *TaskManager) DeleteUser(user *users.User) error { return nil } -func (tm *TaskManager) UpdateUser(user *users.User) error { +func (tm *TaskManagerRepository) UpdateUser(user *users.User) error { _, err := tm.db.Exec("UPDATE task_manager.users SET name=$1, password=$2 WHERE id=$3", user.Name, user.Password, user.Id) if err != nil { return err @@ -31,7 +31,7 @@ func (tm *TaskManager) UpdateUser(user *users.User) error { return nil } -func (tm *TaskManager) GetUser(user_name string) (*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)