03-05-Daniel-todogo/internal/db/task_queries.go

156 lines
3.5 KiB
Go

package db
import (
"database/sql"
"errors"
)
// GetAllTasks retrieves all tasks from the database
func GetAllTasks() ([]Task, error) {
var tasks []Task
query := `SELECT "TaskID", "TaskName", "TaskDescription", "GroupID", "IsDone", "CreatedAt"
FROM "Tasks" ORDER BY "CreatedAt" DESC`
rows, err := DB.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var task Task
err := rows.Scan(&task.TaskID, &task.TaskName, &task.TaskDescription,
&task.GroupID, &task.IsDone, &task.CreatedAt)
if err != nil {
return nil, err
}
tasks = append(tasks, task)
}
return tasks, nil
}
// GetTasksByGroupID retrieves all tasks for a specific group
func GetTasksByGroupID(groupID int) ([]Task, error) {
var tasks []Task
query := `SELECT "TaskID", "TaskName", "TaskDescription", "GroupID", "IsDone", "CreatedAt"
FROM "Tasks" WHERE "GroupID" = $1 ORDER BY "CreatedAt" DESC`
rows, err := DB.Query(query, groupID)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var task Task
err := rows.Scan(&task.TaskID, &task.TaskName, &task.TaskDescription,
&task.GroupID, &task.IsDone, &task.CreatedAt)
if err != nil {
return nil, err
}
tasks = append(tasks, task)
}
return tasks, nil
}
// GetTaskByID retrieves a single task by ID
func GetTaskByID(taskID int) (*Task, error) {
var task Task
query := `SELECT "TaskID", "TaskName", "TaskDescription", "GroupID", "IsDone", "CreatedAt"
FROM "Tasks" WHERE "TaskID" = $1`
err := DB.QueryRow(query, taskID).Scan(&task.TaskID, &task.TaskName,
&task.TaskDescription, &task.GroupID,
&task.IsDone, &task.CreatedAt)
if err != nil {
if err == sql.ErrNoRows {
return nil, errors.New("task not found")
}
return nil, err
}
return &task, nil
}
// CreateTask creates a new task in the database
func CreateTask(taskName string, taskDescription *string, groupID int) (*Task, error) {
var task Task
query := `INSERT INTO "Tasks" ("TaskName", "TaskDescription", "GroupID")
VALUES ($1, $2, $3) RETURNING "TaskID", "TaskName", "TaskDescription", "GroupID", "IsDone", "CreatedAt"`
err := DB.QueryRow(query, taskName, taskDescription, groupID).
Scan(&task.TaskID, &task.TaskName, &task.TaskDescription,
&task.GroupID, &task.IsDone, &task.CreatedAt)
if err != nil {
return nil, err
}
return &task, nil
}
// UpdateTask updates an existing task
func UpdateTask(taskID int, taskName string, taskDescription *string) error {
query := `UPDATE "Tasks" SET "TaskName" = $1, "TaskDescription" = $2
WHERE "TaskID" = $3`
result, err := DB.Exec(query, taskName, taskDescription, taskID)
if err != nil {
return err
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return errors.New("task not found")
}
return nil
}
// MarkTaskDone marks a task as completed
func MarkTaskDone(taskID int) error {
query := `UPDATE "Tasks" SET "IsDone" = true WHERE "TaskID" = $1`
result, err := DB.Exec(query, taskID)
if err != nil {
return err
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return errors.New("task not found")
}
return nil
}
// DeleteTask deletes a task from the database
func DeleteTask(taskID int) error {
query := `DELETE FROM "Tasks" WHERE "TaskID" = $1`
result, err := DB.Exec(query, taskID)
if err != nil {
return err
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return errors.New("task not found")
}
return nil
}