clients.go 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package dbstore
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. "git.linuxforward.com/byop/byop-engine/models"
  7. "github.com/pkg/errors"
  8. )
  9. // Client operations
  10. func (s *SQLiteStore) CreateClient(ctx context.Context, client models.Client) (int, error) {
  11. query := `INSERT INTO clients (name, description, contact_info, active) VALUES (?, ?, ?, ?)`
  12. result, err := s.db.ExecContext(ctx, query, client.Name, client.Description, client.ContactInfo, client.Active)
  13. if err != nil {
  14. return 0, models.NewErrInternalServer("failed to create client", err)
  15. }
  16. id, err := result.LastInsertId()
  17. if err != nil {
  18. return 0, models.NewErrInternalServer("failed to get last insert ID for client", err)
  19. }
  20. return int(id), nil
  21. }
  22. func (s *SQLiteStore) GetAllClients(ctx context.Context) ([]models.Client, error) {
  23. query := `SELECT id, name, description, contact_info, active, created_at, updated_at FROM clients`
  24. rows, err := s.db.QueryContext(ctx, query)
  25. if err != nil {
  26. return nil, models.NewErrInternalServer("failed to query clients", err)
  27. }
  28. defer rows.Close()
  29. var clients []models.Client
  30. for rows.Next() {
  31. var client models.Client
  32. err := rows.Scan(&client.ID, &client.Name, &client.Description, &client.ContactInfo, &client.Active, &client.CreatedAt, &client.UpdatedAt)
  33. if err != nil {
  34. return nil, models.NewErrInternalServer("failed to scan client row", err)
  35. }
  36. clients = append(clients, client)
  37. }
  38. if err = rows.Err(); err != nil {
  39. return nil, models.NewErrInternalServer("error iterating client rows", err)
  40. }
  41. return clients, nil
  42. }
  43. func (s *SQLiteStore) GetClientByID(ctx context.Context, id int) (models.Client, error) {
  44. var client models.Client
  45. query := `SELECT id, name, description, contact_info, active, created_at, updated_at FROM clients WHERE id = ?`
  46. err := s.db.QueryRowContext(ctx, query, id).Scan(&client.ID, &client.Name, &client.Description, &client.ContactInfo, &client.Active, &client.CreatedAt, &client.UpdatedAt)
  47. if err != nil {
  48. if errors.Is(err, sql.ErrNoRows) {
  49. return client, models.NewErrNotFound(fmt.Sprintf("client with ID %d not found", id), err)
  50. }
  51. return client, models.NewErrInternalServer(fmt.Sprintf("failed to get client with ID %d", id), err)
  52. }
  53. return client, nil
  54. }
  55. // UpdateClient updates an existing client
  56. func (s *SQLiteStore) UpdateClient(ctx context.Context, client models.Client) error {
  57. query := `UPDATE clients SET name = ?, description = ?, contact_info = ?, active = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?` // Added CURRENT_TIMESTAMP for updated_at
  58. result, err := s.db.ExecContext(ctx, query, client.Name, client.Description, client.ContactInfo, client.Active, client.ID)
  59. if err != nil {
  60. return models.NewErrInternalServer(fmt.Sprintf("failed to update client with ID %d", client.ID), err)
  61. }
  62. rowsAffected, err := result.RowsAffected()
  63. if err != nil {
  64. return models.NewErrInternalServer(fmt.Sprintf("failed to get rows affected for client update ID %d", client.ID), err)
  65. }
  66. if rowsAffected == 0 {
  67. return models.NewErrNotFound(fmt.Sprintf("client with ID %d not found for update", client.ID), nil)
  68. }
  69. return nil
  70. }
  71. // DeleteClient deletes a client by ID
  72. func (s *SQLiteStore) DeleteClient(ctx context.Context, id int) error {
  73. query := `DELETE FROM clients WHERE id = ?`
  74. result, err := s.db.ExecContext(ctx, query, id)
  75. if err != nil {
  76. return models.NewErrInternalServer(fmt.Sprintf("failed to delete client with ID %d", id), err)
  77. }
  78. rowsAffected, err := result.RowsAffected()
  79. if err != nil {
  80. return models.NewErrInternalServer(fmt.Sprintf("failed to get rows affected for client deletion ID %d", id), err)
  81. }
  82. if rowsAffected == 0 {
  83. return models.NewErrNotFound(fmt.Sprintf("client with ID %d not found for deletion", id), nil)
  84. }
  85. return nil
  86. }