From a56a2ad55470de4fb5710b70820ec62e261fce62 Mon Sep 17 00:00:00 2001 From: puneethzop Date: Fri, 27 Jun 2025 14:40:59 +0530 Subject: [PATCH 1/3] add Three layer arch to task traker --- 3layerarch/.DS_Store | Bin 0 -> 8196 bytes 3layerarch/.idea/.gitignore | 8 +++ 3layerarch/.idea/3layerarch.iml | 9 +++ 3layerarch/.idea/modules.xml | 8 +++ 3layerarch/go.mod | 7 ++ 3layerarch/go.sum | 4 ++ 3layerarch/handler/.DS_Store | Bin 0 -> 6148 bytes 3layerarch/handler/task/handler.go | 103 +++++++++++++++++++++++++++++ 3layerarch/handler/user/handler.go | 57 ++++++++++++++++ 3layerarch/main.go | 78 ++++++++++++++++++++++ 3layerarch/models/task.go | 7 ++ 3layerarch/models/user.go | 6 ++ 3layerarch/service/.DS_Store | Bin 0 -> 6148 bytes 3layerarch/service/task/service.go | 69 +++++++++++++++++++ 3layerarch/service/user/service.go | 37 +++++++++++ 3layerarch/store/.DS_Store | Bin 0 -> 6148 bytes 3layerarch/store/task/store.go | 54 +++++++++++++++ 3layerarch/store/user/store.go | 25 +++++++ 18 files changed, 472 insertions(+) create mode 100644 3layerarch/.DS_Store create mode 100644 3layerarch/.idea/.gitignore create mode 100644 3layerarch/.idea/3layerarch.iml create mode 100644 3layerarch/.idea/modules.xml create mode 100644 3layerarch/go.mod create mode 100644 3layerarch/go.sum create mode 100644 3layerarch/handler/.DS_Store create mode 100644 3layerarch/handler/task/handler.go create mode 100644 3layerarch/handler/user/handler.go create mode 100644 3layerarch/main.go create mode 100644 3layerarch/models/task.go create mode 100644 3layerarch/models/user.go create mode 100644 3layerarch/service/.DS_Store create mode 100644 3layerarch/service/task/service.go create mode 100644 3layerarch/service/user/service.go create mode 100644 3layerarch/store/.DS_Store create mode 100644 3layerarch/store/task/store.go create mode 100644 3layerarch/store/user/store.go diff --git a/3layerarch/.DS_Store b/3layerarch/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..74054d48dfb153ae53269b4dcb0d63855c53fcca GIT binary patch literal 8196 zcmeHMPjAyO6o1~jHDyBT0i<3Kk&rk{1-dZ-69-Bu2LvaA*a1*!nre+m<0?tlLsii$ z@L}MD;1lo#5Z{9%;sDQo);dn2aVluolKou!_iVrSbK*P~07z@>?EusOz{1RAbqkA} z#QIszq&3-c5hX!=fEXx@A%Y(CGicLbJYYOvJYYOvJYYQVFL(gYY?iEob6@nD(s;ml z;J@?$dq3EinQTfq7m~j^u;3v8$`Us7gmsJqxQ;DlQ_8uJTouO@(F2jHM1~kdsAIp) z;3%6?&V>}}K!iFFIWv(F3gNS(p3UJvnnIe=c))ld>j4(Kp8*fLkYHBg_Xh#(xdC;t zpFL7{F<nGr?DnoZ3wznliDa4YUd_)d2ioV7Q zy56Lfd0<`4RAce~{o?!om9582WISLzuzC-WQrl^_aNgsONPP(`*0wRf#LN=I&4uJD zSnzNhB@f3@F8(mYx{Xk#)0A>9B(`As3l{-wV&x3dzShk7zxXmT=Re<~r?U7BqjmtR literal 0 HcmV?d00001 diff --git a/3layerarch/.idea/.gitignore b/3layerarch/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/3layerarch/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/3layerarch/.idea/3layerarch.iml b/3layerarch/.idea/3layerarch.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/3layerarch/.idea/3layerarch.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/3layerarch/.idea/modules.xml b/3layerarch/.idea/modules.xml new file mode 100644 index 0000000..88952d1 --- /dev/null +++ b/3layerarch/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/3layerarch/go.mod b/3layerarch/go.mod new file mode 100644 index 0000000..b2aecc5 --- /dev/null +++ b/3layerarch/go.mod @@ -0,0 +1,7 @@ +module 3layerarch + +go 1.24 + +require github.com/go-sql-driver/mysql v1.9.3 + +require filippo.io/edwards25519 v1.1.0 // indirect diff --git a/3layerarch/go.sum b/3layerarch/go.sum new file mode 100644 index 0000000..4bcdcfa --- /dev/null +++ b/3layerarch/go.sum @@ -0,0 +1,4 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= +github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= diff --git a/3layerarch/handler/.DS_Store b/3layerarch/handler/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2595feb3ca7f9b759744dad4de5fba8c0b80bf31 GIT binary patch literal 6148 zcmeHK%}N6?5T4N$7rgZ7F)yG{e1TZjgXcbg+7=YtvIX0F-pD!N5ObfU9QS%y1~rtw+a`T$|7y(L`ij5d{KWQ!!9eF$QvvT&mIRNp#q= WV=MG%x3 zNWMuXGueEwnG6x}{AoQUnh;TqCdi_Uh)j=~4t((ukR`@d+pU&ux5QWi{sob5ujr9( z=z;FPeE$r#^LG_JO24kXoi0}0W;-}wZ`*WD;~dn_uWy%U$1f6RU|)Z0-`?%T9&8h8 zFc1s`1HnKr@M8v$vqkC?!{~#7U?3Ri8Ib!Sp$TTkVyIUKIxPW!6{c07>(d{YWCEBS ziy>wpY_33aWiK(YCbVlb5m{G6fk4+(4AfMNf!rgfYBYNi Z9ro;43?+)pt2;0r0!m19!N4yt@ByoxGi3k( literal 0 HcmV?d00001 diff --git a/3layerarch/service/task/service.go b/3layerarch/service/task/service.go new file mode 100644 index 0000000..2dedc1c --- /dev/null +++ b/3layerarch/service/task/service.go @@ -0,0 +1,69 @@ +package taskservice + +import ( + "3layerarch/models" + "3layerarch/store/task" + "database/sql" + "errors" +) + +type Service struct { + Store *taskstore.Store +} + +func New(store *taskstore.Store) *Service { + return &Service{Store: store} +} + +func (s *Service) CreateTask(t models.Task) error { + if t.Task == "" { + return errors.New("task cannot be empty") + } + return s.Store.Create(t) +} + +func (s *Service) GetTask(id int) (models.Task, error) { + if id <= 0 { + return models.Task{}, errors.New("invalid task ID") + } + task, err := s.Store.GetByID(id) + if err != nil { + if err == sql.ErrNoRows { + return models.Task{}, errors.New("task not found") + } + return models.Task{}, err + } + return task, nil +} + +func (s *Service) ViewTasks() ([]models.Task, error) { + return s.Store.GetAll() +} + +func (s *Service) UpdateTask(id int) error { + if id <= 0 { + return errors.New("invalid task ID") + } + _, err := s.Store.GetByID(id) + if err != nil { + if err == sql.ErrNoRows { + return errors.New("task not found") + } + return err + } + return s.Store.Update(id) +} + +func (s *Service) DeleteTask(id int) error { + if id <= 0 { + return errors.New("invalid task ID") + } + _, err := s.Store.GetByID(id) + if err != nil { + if err == sql.ErrNoRows { + return errors.New("task not found") + } + return err + } + return s.Store.Delete(id) +} diff --git a/3layerarch/service/user/service.go b/3layerarch/service/user/service.go new file mode 100644 index 0000000..66c1a1a --- /dev/null +++ b/3layerarch/service/user/service.go @@ -0,0 +1,37 @@ +package userservice + +import ( + "3layerarch/models" + "3layerarch/store/user" + "database/sql" + "errors" +) + +type Service struct { + Store *userstore.Store +} + +func New(store *userstore.Store) *Service { + return &Service{Store: store} +} + +func (s *Service) CreateUser(u models.User) error { + if u.Name == "" { + return errors.New("user name cannot be empty") + } + return s.Store.Create(u) +} + +func (s *Service) GetUser(id int) (models.User, error) { + if id <= 0 { + return models.User{}, errors.New("invalid user ID") + } + user, err := s.Store.GetByID(id) + if err != nil { + if err == sql.ErrNoRows { + return models.User{}, errors.New("user not found") + } + return models.User{}, err + } + return user, nil +} diff --git a/3layerarch/store/.DS_Store b/3layerarch/store/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..090e2e4abb364d5283b0fc81352c09d76673a894 GIT binary patch literal 6148 zcmeHK%}N6?5T4N$7rgZ7F-I>7J$j2}J$UX5Xj@R|mMy6FypPWzK9+v-F zAo(Vl%w+SyW->&?v**>6XhK9anjniZA~HQ{I`G9uK$aLcZMR&s-2!6?_!mUJy`m?& zqeohQ`Ti@|F5Xr2DE+$jemY-vo9*C$y=~JqjdM`HoV{M2AHPYQfqnI@efzK%d$3KY z!9Xw&3gU~&K9Xp45JSQf`MS5XF%?UgeI6Bi=kc}=(Gd?R+v_Su1|kpk_ljT zEQXkYu(<-wmA%AZuN>IiVb8w47@9k=?u Date: Sun, 29 Jun 2025 11:33:07 +0530 Subject: [PATCH 2/3] update interface --- 3layerarch/handler/task/handler.go | 13 ++++++--- 3layerarch/handler/user/handler.go | 10 ++++--- 3layerarch/main.go | 13 ++++----- 3layerarch/models/task.go | 1 + 3layerarch/service/task/service.go | 43 ++++++++++++++++++++++-------- 3layerarch/service/user/service.go | 16 ++++++----- 3layerarch/store/task/store.go | 30 ++++++++++----------- 3layerarch/store/user/store.go | 16 +++++------ 8 files changed, 90 insertions(+), 52 deletions(-) diff --git a/3layerarch/handler/task/handler.go b/3layerarch/handler/task/handler.go index 419c361..fbb1e66 100644 --- a/3layerarch/handler/task/handler.go +++ b/3layerarch/handler/task/handler.go @@ -7,14 +7,21 @@ import ( "strconv" "3layerarch/models" - taskservice "3layerarch/service/task" ) +type TaskService interface { + CreateTask(t models.Task) error + GetTask(id int) (models.Task, error) + ViewTasks() ([]models.Task, error) + UpdateTask(id int) error + DeleteTask(id int) error +} + type Handler struct { - Service *taskservice.Service + Service TaskService } -func New(service *taskservice.Service) *Handler { +func New(service TaskService) *Handler { return &Handler{Service: service} } diff --git a/3layerarch/handler/user/handler.go b/3layerarch/handler/user/handler.go index d4fe654..7f18ff8 100644 --- a/3layerarch/handler/user/handler.go +++ b/3layerarch/handler/user/handler.go @@ -7,14 +7,18 @@ import ( "strconv" "3layerarch/models" - userservice "3layerarch/service/user" ) +type UserService interface { + CreateUser(u models.User) error + GetUser(id int) (models.User, error) +} + type Handler struct { - Service *userservice.Service + Service UserService } -func New(service *userservice.Service) *Handler { +func New(service UserService) *Handler { return &Handler{Service: service} } diff --git a/3layerarch/main.go b/3layerarch/main.go index 55e8fbc..e92b8e1 100644 --- a/3layerarch/main.go +++ b/3layerarch/main.go @@ -29,7 +29,8 @@ func main() { _, err = db.Exec(`CREATE TABLE IF NOT EXISTS TASKS ( id INT AUTO_INCREMENT PRIMARY KEY, task TEXT, - completed BOOL DEFAULT FALSE + completed BOOL DEFAULT FALSE, + user_id int );`) if err != nil { log.Fatal("Failed to create TASKS table:", err) @@ -44,16 +45,16 @@ func main() { log.Fatal("Failed to create USERS table:", err) } - // Task dependency setup - taskStore := taskstore.New(db) - taskService := taskservice.New(taskStore) - taskHandler := taskhandler.New(taskService) - // User dependency setup userStore := userstore.New(db) userService := userservice.New(userStore) userHandler := userhandler.New(userService) + // Task dependency setup + taskStore := taskstore.New(db) + taskService := taskservice.New(taskStore, userService) + taskHandler := taskhandler.New(taskService) + // Task routes http.HandleFunc("POST /task", taskHandler.CreateTask) http.HandleFunc("GET /task", taskHandler.ViewTasks) diff --git a/3layerarch/models/task.go b/3layerarch/models/task.go index ea4f8df..e29c725 100644 --- a/3layerarch/models/task.go +++ b/3layerarch/models/task.go @@ -4,4 +4,5 @@ type Task struct { ID int `json:"id"` Task string `json:"task"` Completed bool `json:"completed"` + UserID int `json:"user_id"` } diff --git a/3layerarch/service/task/service.go b/3layerarch/service/task/service.go index 2dedc1c..31234fa 100644 --- a/3layerarch/service/task/service.go +++ b/3layerarch/service/task/service.go @@ -1,32 +1,53 @@ package taskservice import ( + //"3layerarch/handler/userhandler" "3layerarch/models" - "3layerarch/store/task" "database/sql" "errors" + "fmt" ) +type TaskStore interface { + CreateTask(t models.Task) error + GetTask(id int) (models.Task, error) + ViewTasks() ([]models.Task, error) + UpdateTask(id int) error + DeleteTask(id int) error +} + +type UserService interface { + GetUser(id int) (models.User, error) +} + type Service struct { - Store *taskstore.Store + TaskStore TaskStore + UserService UserService } -func New(store *taskstore.Store) *Service { - return &Service{Store: store} +func New(ts TaskStore, us UserService) *Service { + return &Service{TaskStore: ts, UserService: us} } func (s *Service) CreateTask(t models.Task) error { + fmt.Println("CreateTask received:", t) + if t.Task == "" { return errors.New("task cannot be empty") } - return s.Store.Create(t) + // Validate user existence before creating task + _, err := s.UserService.GetUser(t.UserID) + if err != nil { + return errors.New("user ID not found") + } + return s.TaskStore.CreateTask(t) } func (s *Service) GetTask(id int) (models.Task, error) { if id <= 0 { return models.Task{}, errors.New("invalid task ID") } - task, err := s.Store.GetByID(id) + task, err := s.TaskStore.GetTask(id) if err != nil { if err == sql.ErrNoRows { return models.Task{}, errors.New("task not found") @@ -37,33 +58,33 @@ func (s *Service) GetTask(id int) (models.Task, error) { } func (s *Service) ViewTasks() ([]models.Task, error) { - return s.Store.GetAll() + return s.TaskStore.ViewTasks() } func (s *Service) UpdateTask(id int) error { if id <= 0 { return errors.New("invalid task ID") } - _, err := s.Store.GetByID(id) + _, err := s.TaskStore.GetTask(id) if err != nil { if err == sql.ErrNoRows { return errors.New("task not found") } return err } - return s.Store.Update(id) + return s.TaskStore.UpdateTask(id) } func (s *Service) DeleteTask(id int) error { if id <= 0 { return errors.New("invalid task ID") } - _, err := s.Store.GetByID(id) + _, err := s.TaskStore.GetTask(id) if err != nil { if err == sql.ErrNoRows { return errors.New("task not found") } return err } - return s.Store.Delete(id) + return s.TaskStore.DeleteTask(id) } diff --git a/3layerarch/service/user/service.go b/3layerarch/service/user/service.go index 66c1a1a..fab65aa 100644 --- a/3layerarch/service/user/service.go +++ b/3layerarch/service/user/service.go @@ -2,16 +2,20 @@ package userservice import ( "3layerarch/models" - "3layerarch/store/user" "database/sql" "errors" ) +type UserStore interface { + CreateUser(u models.User) error + GetUser(id int) (models.User, error) +} + type Service struct { - Store *userstore.Store + Store UserStore } -func New(store *userstore.Store) *Service { +func New(store UserStore) *Service { return &Service{Store: store} } @@ -19,19 +23,19 @@ func (s *Service) CreateUser(u models.User) error { if u.Name == "" { return errors.New("user name cannot be empty") } - return s.Store.Create(u) + return s.Store.CreateUser(u) } func (s *Service) GetUser(id int) (models.User, error) { if id <= 0 { return models.User{}, errors.New("invalid user ID") } - user, err := s.Store.GetByID(id) + u, err := s.Store.GetUser(id) if err != nil { if err == sql.ErrNoRows { return models.User{}, errors.New("user not found") } return models.User{}, err } - return user, nil + return u, nil } diff --git a/3layerarch/store/task/store.go b/3layerarch/store/task/store.go index e712f86..d107dd5 100644 --- a/3layerarch/store/task/store.go +++ b/3layerarch/store/task/store.go @@ -6,36 +6,36 @@ import ( ) type Store struct { - DB *sql.DB + db *sql.DB } func New(db *sql.DB) *Store { - return &Store{DB: db} + return &Store{db: db} } -func (s *Store) Create(task models.Task) error { - _, err := s.DB.Exec("INSERT INTO TASKS (task, completed) VALUES (?, ?)", task.Task, task.Completed) +func (s *Store) CreateTask(t models.Task) error { + _, err := s.db.Exec("INSERT INTO TASKS (task, completed, user_id) VALUES (?, ?, ?)", t.Task, t.Completed, t.UserID) return err } -func (s *Store) GetByID(id int) (models.Task, error) { +func (s *Store) GetTask(id int) (models.Task, error) { var t models.Task - err := s.DB.QueryRow("SELECT id, task, completed FROM TASKS WHERE id = ?", id). - Scan(&t.ID, &t.Task, &t.Completed) + err := s.db.QueryRow("SELECT id, task, completed, user_id FROM TASKS WHERE id = ?", id). + Scan(&t.ID, &t.Task, &t.Completed, &t.UserID) return t, err } -func (s *Store) GetAll() ([]models.Task, error) { - rows, err := s.DB.Query("SELECT id, task, completed FROM TASKS") +func (s *Store) ViewTasks() ([]models.Task, error) { + rows, err := s.db.Query("SELECT id, task, completed, user_id FROM TASKS") if err != nil { return nil, err } defer rows.Close() - tasks := []models.Task{} + var tasks []models.Task for rows.Next() { var t models.Task - if err := rows.Scan(&t.ID, &t.Task, &t.Completed); err != nil { + if err := rows.Scan(&t.ID, &t.Task, &t.Completed, &t.UserID); err != nil { return nil, err } tasks = append(tasks, t) @@ -43,12 +43,12 @@ func (s *Store) GetAll() ([]models.Task, error) { return tasks, nil } -func (s *Store) Update(id int) error { - _, err := s.DB.Exec("UPDATE TASKS SET completed = true WHERE id = ?", id) +func (s *Store) UpdateTask(id int) error { + _, err := s.db.Exec("UPDATE TASKS SET completed = true WHERE id = ?", id) return err } -func (s *Store) Delete(id int) error { - _, err := s.DB.Exec("DELETE FROM TASKS WHERE id = ?", id) +func (s *Store) DeleteTask(id int) error { + _, err := s.db.Exec("DELETE FROM TASKS WHERE id = ?", id) return err } diff --git a/3layerarch/store/user/store.go b/3layerarch/store/user/store.go index 800b1b8..bb00c47 100644 --- a/3layerarch/store/user/store.go +++ b/3layerarch/store/user/store.go @@ -6,20 +6,20 @@ import ( ) type Store struct { - DB *sql.DB + db *sql.DB } func New(db *sql.DB) *Store { - return &Store{DB: db} + return &Store{db: db} } -func (s *Store) Create(user models.User) error { - _, err := s.DB.Exec("INSERT INTO USERS (name) VALUES (?)", user.Name) +func (s *Store) CreateUser(u models.User) error { + _, err := s.db.Exec("INSERT INTO USERS (name) VALUES (?)", u.Name) return err } -func (s *Store) GetByID(id int) (models.User, error) { - var user models.User - err := s.DB.QueryRow("SELECT id, name FROM USERS WHERE id = ?", id).Scan(&user.ID, &user.Name) - return user, err +func (s *Store) GetUser(id int) (models.User, error) { + var u models.User + err := s.db.QueryRow("SELECT id, name FROM USERS WHERE id = ?", id).Scan(&u.ID, &u.Name) + return u, err } From 20e6f388fce46a57ef25f8fd0ba669c61757e507 Mon Sep 17 00:00:00 2001 From: puneethzop Date: Mon, 30 Jun 2025 11:19:04 +0530 Subject: [PATCH 3/3] update linters --- 3layerarch/handler/task/handler.go | 9 +++++++-- 3layerarch/handler/user/handler.go | 5 ++++- 3layerarch/main.go | 6 +++++- 3layerarch/store/task/store.go | 7 ++++++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/3layerarch/handler/task/handler.go b/3layerarch/handler/task/handler.go index fbb1e66..9e8f435 100644 --- a/3layerarch/handler/task/handler.go +++ b/3layerarch/handler/task/handler.go @@ -2,6 +2,7 @@ package taskhandler import ( "encoding/json" + "fmt" "io" "net/http" "strconv" @@ -60,7 +61,9 @@ func (h *Handler) GetTask(w http.ResponseWriter, r *http.Request) { return } b, _ := json.Marshal(t) - w.Write(b) + if _, err := w.Write(b); err != nil { + fmt.Printf("failed to write response: %v\n", err) + } } func (h *Handler) ViewTasks(w http.ResponseWriter, _ *http.Request) { @@ -70,7 +73,9 @@ func (h *Handler) ViewTasks(w http.ResponseWriter, _ *http.Request) { return } b, _ := json.Marshal(tasks) - w.Write(b) + if _, err := w.Write(b); err != nil { + fmt.Printf("failed to write response: %v\n", err) + } } func (h *Handler) UpdateTask(w http.ResponseWriter, r *http.Request) { diff --git a/3layerarch/handler/user/handler.go b/3layerarch/handler/user/handler.go index 7f18ff8..14624ca 100644 --- a/3layerarch/handler/user/handler.go +++ b/3layerarch/handler/user/handler.go @@ -2,6 +2,7 @@ package userhandler import ( "encoding/json" + "fmt" "io" "net/http" "strconv" @@ -57,5 +58,7 @@ func (h *Handler) GetUser(w http.ResponseWriter, r *http.Request) { return } b, _ := json.Marshal(u) - w.Write(b) + if _, err := w.Write(b); err != nil { + fmt.Printf("failed to write response: %v\n", err) + } } diff --git a/3layerarch/main.go b/3layerarch/main.go index e92b8e1..1f434a0 100644 --- a/3layerarch/main.go +++ b/3layerarch/main.go @@ -23,7 +23,11 @@ func main() { if err != nil { log.Fatal("DB connection error:", err) } - defer db.Close() + defer func() { + if err := db.Close(); err != nil { + log.Println("Error closing DB:", err) + } + }() // Ensure TASKS table exists _, err = db.Exec(`CREATE TABLE IF NOT EXISTS TASKS ( diff --git a/3layerarch/store/task/store.go b/3layerarch/store/task/store.go index d107dd5..ca2bc15 100644 --- a/3layerarch/store/task/store.go +++ b/3layerarch/store/task/store.go @@ -3,6 +3,7 @@ package taskstore import ( "3layerarch/models" "database/sql" + "log" ) type Store struct { @@ -30,7 +31,11 @@ func (s *Store) ViewTasks() ([]models.Task, error) { if err != nil { return nil, err } - defer rows.Close() + defer func() { + if err := rows.Close(); err != nil { + log.Println("Error closing rows:", err) + } + }() var tasks []models.Task for rows.Next() {