Upload files to "internal/db"
This commit is contained in:
parent
6bc048884d
commit
12e679fa59
78
internal/db/connection.go
Normal file
78
internal/db/connection.go
Normal file
@ -0,0 +1,78 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
|
||||
const (
|
||||
host = "202.46.28.160"
|
||||
port = 45432
|
||||
user = "5803024005"
|
||||
password = "pw5803024005"
|
||||
dbname = "tgs01_5803024005"
|
||||
)
|
||||
|
||||
var DB *sql.DB
|
||||
|
||||
func InitDB() {
|
||||
psqlconn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)
|
||||
|
||||
var err error
|
||||
DB, err = sql.Open("postgres", psqlconn)
|
||||
if err != nil {
|
||||
log.Fatal("Failed to open database connection:", err)
|
||||
}
|
||||
|
||||
// Test the connection
|
||||
err = DB.Ping()
|
||||
if err != nil {
|
||||
log.Fatal("Failed to ping database:", err)
|
||||
}
|
||||
|
||||
log.Println("Database connection established successfully")
|
||||
|
||||
// Create tables if they don't exist
|
||||
createTables()
|
||||
}
|
||||
|
||||
func createTables() {
|
||||
// Create Groups table
|
||||
createGroupsTable := `
|
||||
CREATE TABLE IF NOT EXISTS "Groups" (
|
||||
"GroupID" SERIAL PRIMARY KEY,
|
||||
"GroupName" VARCHAR(255) NOT NULL
|
||||
);`
|
||||
|
||||
_, err := DB.Exec(createGroupsTable)
|
||||
if err != nil {
|
||||
log.Fatal("Failed to create Groups table:", err)
|
||||
}
|
||||
|
||||
// Create Tasks table
|
||||
createTasksTable := `
|
||||
CREATE TABLE IF NOT EXISTS "Tasks" (
|
||||
"TaskID" SERIAL PRIMARY KEY,
|
||||
"TaskName" VARCHAR(255) NOT NULL,
|
||||
"TaskDescription" TEXT,
|
||||
"GroupID" INTEGER REFERENCES "Groups"("GroupID") ON DELETE CASCADE,
|
||||
"IsDone" BOOLEAN DEFAULT FALSE,
|
||||
"CreatedAt" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);`
|
||||
|
||||
_, err = DB.Exec(createTasksTable)
|
||||
if err != nil {
|
||||
log.Fatal("Failed to create Tasks table:", err)
|
||||
}
|
||||
|
||||
log.Println("Database tables created/verified successfully")
|
||||
}
|
||||
|
||||
func CheckError(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
100
internal/db/group_queries.go
Normal file
100
internal/db/group_queries.go
Normal file
@ -0,0 +1,100 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
)
|
||||
|
||||
// GetAllGroups retrieves all groups from the database
|
||||
func GetAllGroups() ([]Group, error) {
|
||||
var groups []Group
|
||||
query := `SELECT "GroupID", "GroupName" FROM "Groups" ORDER BY "GroupID"`
|
||||
|
||||
rows, err := DB.Query(query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
for rows.Next() {
|
||||
var group Group
|
||||
err := rows.Scan(&group.GroupID, &group.GroupName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
groups = append(groups, group)
|
||||
}
|
||||
|
||||
return groups, nil
|
||||
}
|
||||
|
||||
// GetGroupByID retrieves a single group by ID
|
||||
func GetGroupByID(groupID int) (*Group, error) {
|
||||
var group Group
|
||||
query := `SELECT "GroupID", "GroupName" FROM "Groups" WHERE "GroupID" = $1`
|
||||
|
||||
err := DB.QueryRow(query, groupID).Scan(&group.GroupID, &group.GroupName)
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, errors.New("group not found")
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &group, nil
|
||||
}
|
||||
|
||||
// CreateGroup creates a new group in the database
|
||||
func CreateGroup(groupName string) (*Group, error) {
|
||||
var group Group
|
||||
query := `INSERT INTO "Groups" ("GroupName") VALUES ($1) RETURNING "GroupID", "GroupName"`
|
||||
|
||||
err := DB.QueryRow(query, groupName).Scan(&group.GroupID, &group.GroupName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &group, nil
|
||||
}
|
||||
|
||||
// UpdateGroup updates an existing group
|
||||
func UpdateGroup(groupID int, groupName string) error {
|
||||
query := `UPDATE "Groups" SET "GroupName" = $1 WHERE "GroupID" = $2`
|
||||
|
||||
result, err := DB.Exec(query, groupName, groupID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
rowsAffected, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if rowsAffected == 0 {
|
||||
return errors.New("group not found")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeleteGroup deletes a group from the database
|
||||
func DeleteGroup(groupID int) error {
|
||||
query := `DELETE FROM "Groups" WHERE "GroupID" = $1`
|
||||
|
||||
result, err := DB.Exec(query, groupID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
rowsAffected, err := result.RowsAffected()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if rowsAffected == 0 {
|
||||
return errors.New("group not found")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
19
internal/db/models.go
Normal file
19
internal/db/models.go
Normal file
@ -0,0 +1,19 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
type Group struct {
|
||||
GroupID int `json:"group_id"`
|
||||
GroupName string `json:"group_name"`
|
||||
}
|
||||
|
||||
type Task struct {
|
||||
TaskID int `json:"task_id"`
|
||||
TaskName string `json:"task_name"`
|
||||
TaskDescription *string `json:"task_description,omitempty"`
|
||||
GroupID int `json:"group_id"`
|
||||
IsDone bool `json:"is_done"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
155
internal/db/task_queries.go
Normal file
155
internal/db/task_queries.go
Normal file
@ -0,0 +1,155 @@
|
||||
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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user