156 lines
3.5 KiB
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
|
|
}
|