commit 506106fc5ab6c810f1487681bbeefd140d0b1ff4 Author: Ivan Titov Date: Sun Mar 9 23:22:12 2025 +0300 save diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000..99fd805 --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello") +} diff --git a/database/init/00-users-init.sql b/database/init/00-users-init.sql new file mode 100644 index 0000000..29ae8c6 --- /dev/null +++ b/database/init/00-users-init.sql @@ -0,0 +1,14 @@ +-- создаем базу данных задач +CREATE DATABASE tasks; + +-- подключаемся к базе данных +\connect 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 +); + diff --git a/database/init/01-tasks-init.sql b/database/init/01-tasks-init.sql new file mode 100644 index 0000000..7587160 --- /dev/null +++ b/database/init/01-tasks-init.sql @@ -0,0 +1,15 @@ +-- подключаемся к базе данных +\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/deployments/task-manager.yaml b/deployments/task-manager.yaml new file mode 100644 index 0000000..25e5263 --- /dev/null +++ b/deployments/task-manager.yaml @@ -0,0 +1,14 @@ +version: '3' +services: + tasks-postgres: + image: postgres:13 + name: tasks-postgres + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + 5432:5432 + volumes: + - ../database/init:/docker-entrypoint-initdb.d + + diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..7a20dee --- /dev/null +++ b/go.mod @@ -0,0 +1,8 @@ +module task_manager + +go 1.24 + +require ( + github.com/go-chi/chi/v5 v5.2.1 // indirect + github.com/lib/pq v1.10.9 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..8aae7a1 --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +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/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..797243b --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,5 @@ +package config + +const ( + CONNECTION_STRING = "postgres://postgres:postgres@localhost:5432/tasks" +) diff --git a/internal/domain/tasks/task.go b/internal/domain/tasks/task.go new file mode 100644 index 0000000..0781c2b --- /dev/null +++ b/internal/domain/tasks/task.go @@ -0,0 +1,11 @@ +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"` +} diff --git a/internal/domain/users/user.go b/internal/domain/users/user.go new file mode 100644 index 0000000..a161b5c --- /dev/null +++ b/internal/domain/users/user.go @@ -0,0 +1,10 @@ +package users + +import "task_manager/internal/domain/tasks" + +type User struct { + Id int `json:"id"` + Name string `json:"name"` + Password string `json:"password"` + Tasks []tasks.Task +} diff --git a/internal/persistance/task_manager.go b/internal/persistance/task_manager.go new file mode 100644 index 0000000..1c37c66 --- /dev/null +++ b/internal/persistance/task_manager.go @@ -0,0 +1,20 @@ +package persistance + +import ( + "crypto/md5" + "database/sql" + "encoding/hex" +) + +type TaskManager struct { + db *sql.DB +} + +func NewTaskManager(db *sql.DB) *TaskManager { + return &TaskManager{db: db} +} + +func GetMD5Hash(text string) string { + hash := md5.Sum([]byte(text)) + return hex.EncodeToString(hash[:]) +} diff --git a/internal/persistance/task_repository.go b/internal/persistance/task_repository.go new file mode 100644 index 0000000..d699917 --- /dev/null +++ b/internal/persistance/task_repository.go @@ -0,0 +1,71 @@ +package persistance + +import ( + "log" + "task_manager/internal/domain/tasks" + + _ "github.com/lib/pq" +) + +func (tm *TaskManager) 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 + } + return nil +} + +func (tm *TaskManager) 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 + } + return nil +} + +func (tm *TaskManager) DeleteTask(task tasks.Task) error { + _, err := tm.db.Exec("DELETE FROM task_manager.tasks WHERE id=$1", task.Id) + if err != nil { + return err + } + return nil +} + +func (tm *TaskManager) 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) + if err != nil { + log.Println("Ошибка получения пользователя:", err) + return nil, err + } + + return &task, nil +} + +func (tm *TaskManager) 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) + if err != nil { + return user_tasks, err + } + + for rows.Next() { + task := tasks.Task{} + err = rows.Scan(&task.Id, + &task.IdUser, + &task.Name, + &task.Description, + &task.Status, + &task.CreationDate, + &task.UpdateDate, + ) + if err != nil { + return user_tasks, err + } + user_tasks = append(user_tasks, task) + } + + return user_tasks, nil +} diff --git a/internal/persistance/user_repository.go b/internal/persistance/user_repository.go new file mode 100644 index 0000000..4d115d6 --- /dev/null +++ b/internal/persistance/user_repository.go @@ -0,0 +1,44 @@ +package persistance + +import ( + "log" + "task_manager/internal/domain/users" + + _ "github.com/lib/pq" +) + +func (tm *TaskManager) 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 + } + return nil +} + +func (tm *TaskManager) DeleteUser(user *users.User) error { + _, err := tm.db.Exec("DELETE FROM task_manager.users WHERE name=$1", user.Name) + if err != nil { + return err + } + return nil +} + +func (tm *TaskManager) 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 + } + return nil +} + +func (tm *TaskManager) 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) + if err != nil { + log.Println("Ошибка получения пользователя:", err) + return nil, err + } + + return &user, nil +}