1
0
mirror of https://github.com/MADTeacher/go_basics.git synced 2025-11-23 21:34:47 +02:00
Files
go_basics/part_6/6.1/golang/todo/db/projects_crud.go

93 lines
2.9 KiB
Go
Raw Normal View History

2025-06-16 11:31:09 +03:00
package db
import (
"errors"
"github.com/mattn/go-sqlite3"
)
// Метод для добавления проекта в базу данных
func (s *SQLiteRepository) AddProject(project Project) (*Project, error) {
res, err := s.db.Exec( // Запрос на добавление проекта
// Используем экранирование данных для предотвращения SQL-инъекции
// данные из переменных project.Name и project.Description
// будут вставлены в запрос в место знаков вопроса
// в пордке их перечисления
"INSERT INTO projects(name, description) values(?,?)",
project.Name, project.Description,
)
if err != nil { // Если произошла ошибка
var sqliteErr sqlite3.Error
// Если такой проект уже существует
if errors.As(err, &sqliteErr) {
if errors.Is(
sqliteErr.ExtendedCode,
sqlite3.ErrConstraintUnique) {
return nil, ErrDuplicate // Возвращаем ErrDuplicate
}
}
return nil, err
}
id, err := res.LastInsertId() // Получаем ID
if err != nil {
return nil, err
}
project.ID = int(id) // Устанавливаем ID проекту
return &project, nil
}
// Метод для удаления проекта из базы данных
func (s *SQLiteRepository) DeleteProject(projectID int) error {
// Запрос на удаление проекта из таблицы projects
s.db.Exec("DELETE FROM projects WHERE id = ?", projectID)
// Запрос на удаление всех задач, связанных с проектом
res, err := s.db.Exec(
"DELETE FROM tasks WHERE project_id = ?",
projectID,
)
if err != nil {
return err
}
// Проверяем, были ли удалены задачи
rowsAffected, err := res.RowsAffected()
if err != nil {
return err
}
// Если не было удалено ни одной задачи
if rowsAffected == 0 {
return ErrDeleteFailed
}
return err
}
// Метод для получения всех проектов
func (s *SQLiteRepository) GetAllProjects() ([]Project, error) {
// Запрос на получение всех проектов
rows, err := s.db.Query("SELECT * FROM projects")
if err != nil {
return nil, err
}
defer rows.Close() // Закрываем соединение
// Перебираем результаты запроса и добавляем в []Project
var projects []Project
for rows.Next() {
var project Project
// считываем данные из каждой строки, в соответствующие
// поля структуры Project
if err := rows.Scan(&project.ID, &project.Name,
&project.Description); err != nil {
return nil, err
}
// Добавляем проект в срез
projects = append(projects, project)
}
return projects, nil
}