This commit is contained in:
Ivan Titov 2025-03-21 10:33:45 +03:00
parent 506106fc5a
commit 102413daaf
16 changed files with 134 additions and 46 deletions

View File

@ -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
);

View File

@ -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
);

View File

@ -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
);

View File

@ -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
);

View File

@ -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
);

4
go.mod
View File

@ -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
)

5
go.sum
View File

@ -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=

14
internal/app/handlers.go Normal file
View File

@ -0,0 +1,14 @@
package app
import (
"net/http"
gorilla "github.com/gorilla/mux"
)
func (rm *TaskManager) RegisterRoutes(router *gorilla.Router) {
}

View File

@ -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}
}

View File

@ -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
}

View File

@ -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
}

View File

@ -3,9 +3,11 @@ package tasks
type Task struct {
Id int `json:"id"`
IdUser int `json:"id_user"`
Name string `json:"name"`
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"`
CreationDate string `json:"creation_date"`
UpdateDate string `json:"update_date"`
Duration int `json:"duration"`
}

View File

@ -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
}

View File

@ -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 {

View File

@ -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)

View File

@ -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)