tickets.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. // CreateTicket creates a new ticket
  10. func (s *SQLiteStore) CreateTicket(ctx context.Context, ticket *models.Ticket) error {
  11. query := `INSERT INTO tickets (client_id, title, description, status, priority, assigned_to) VALUES (?, ?, ?, ?, ?, ?)`
  12. result, err := s.db.ExecContext(ctx, query, ticket.ClientID, ticket.Title, ticket.Description, ticket.Status, ticket.Priority, ticket.AssignedTo)
  13. if err != nil {
  14. return models.NewErrInternalServer("failed to create ticket", err)
  15. }
  16. id, err := result.LastInsertId()
  17. if err != nil {
  18. return models.NewErrInternalServer("failed to get last insert ID for ticket", err)
  19. }
  20. ticket.ID = int(id)
  21. return nil
  22. }
  23. // GetTicketByID retrieves a ticket by its ID
  24. func (s *SQLiteStore) GetTicketByID(ctx context.Context, id int) (*models.Ticket, error) {
  25. query := `SELECT id, client_id, title, description, status, priority, assigned_to, created_at, updated_at FROM tickets WHERE id = ?`
  26. row := s.db.QueryRowContext(ctx, query, id)
  27. ticket := &models.Ticket{}
  28. err := row.Scan(&ticket.ID, &ticket.ClientID, &ticket.Title, &ticket.Description, &ticket.Status, &ticket.Priority, &ticket.AssignedTo, &ticket.CreatedAt, &ticket.UpdatedAt)
  29. if err != nil {
  30. if errors.Is(err, sql.ErrNoRows) {
  31. return nil, models.NewErrNotFound(fmt.Sprintf("ticket with ID %d not found", id), err)
  32. }
  33. return nil, models.NewErrInternalServer(fmt.Sprintf("failed to get ticket with ID %d", id), err)
  34. }
  35. return ticket, nil
  36. }
  37. // GetTickets retrieves all tickets
  38. func (s *SQLiteStore) GetTickets(ctx context.Context) ([]models.Ticket, error) {
  39. query := `SELECT id, client_id, title, description, status, priority, assigned_to, created_at, updated_at FROM tickets`
  40. rows, err := s.db.QueryContext(ctx, query)
  41. if err != nil {
  42. return nil, models.NewErrInternalServer("failed to query tickets", err)
  43. }
  44. defer rows.Close()
  45. var tickets []models.Ticket
  46. for rows.Next() {
  47. var ticket models.Ticket
  48. err := rows.Scan(&ticket.ID, &ticket.ClientID, &ticket.Title, &ticket.Description, &ticket.Status, &ticket.Priority, &ticket.AssignedTo, &ticket.CreatedAt, &ticket.UpdatedAt)
  49. if err != nil {
  50. return nil, models.NewErrInternalServer("failed to scan ticket row", err)
  51. }
  52. tickets = append(tickets, ticket)
  53. }
  54. if err = rows.Err(); err != nil {
  55. return nil, models.NewErrInternalServer("error iterating ticket rows", err)
  56. }
  57. return tickets, nil
  58. }
  59. // UpdateTicket updates an existing ticket
  60. func (s *SQLiteStore) UpdateTicket(ctx context.Context, ticket *models.Ticket) error {
  61. query := `UPDATE tickets SET client_id = ?, title = ?, description = ?, status = ?, priority = ?, assigned_to = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?`
  62. result, err := s.db.ExecContext(ctx, query, ticket.ClientID, ticket.Title, ticket.Description, ticket.Status, ticket.Priority, ticket.AssignedTo, ticket.ID)
  63. if err != nil {
  64. return models.NewErrInternalServer(fmt.Sprintf("failed to update ticket with ID %d", ticket.ID), err)
  65. }
  66. rowsAffected, err := result.RowsAffected()
  67. if err != nil {
  68. return models.NewErrInternalServer(fmt.Sprintf("failed to get rows affected for ticket update ID %d", ticket.ID), err)
  69. }
  70. if rowsAffected == 0 {
  71. return models.NewErrNotFound(fmt.Sprintf("ticket with ID %d not found for update", ticket.ID), nil)
  72. }
  73. return nil
  74. }
  75. // CreateTicketComment creates a new comment for a ticket
  76. func (s *SQLiteStore) CreateTicketComment(ctx context.Context, comment *models.TicketComment) error {
  77. query := `INSERT INTO ticket_comments (ticket_id, user_id, comment) VALUES (?, ?, ?)`
  78. result, err := s.db.ExecContext(ctx, query, comment.TicketID, comment.UserID, comment.Content)
  79. if err != nil {
  80. return models.NewErrInternalServer("failed to create ticket comment", err)
  81. }
  82. id, err := result.LastInsertId()
  83. if err != nil {
  84. return models.NewErrInternalServer("failed to get last insert ID for ticket comment", err)
  85. }
  86. comment.ID = int(id)
  87. return nil
  88. }
  89. // GetTicketComments retrieves all comments for a given ticket ID
  90. func (s *SQLiteStore) GetTicketComments(ctx context.Context, ticketID int) ([]models.TicketComment, error) {
  91. query := `SELECT id, ticket_id, user_id, comment, created_at FROM ticket_comments WHERE ticket_id = ? ORDER BY created_at ASC`
  92. rows, err := s.db.QueryContext(ctx, query, ticketID)
  93. if err != nil {
  94. return nil, models.NewErrInternalServer(fmt.Sprintf("failed to query ticket comments for ticket ID %d", ticketID), err)
  95. }
  96. defer rows.Close()
  97. var comments []models.TicketComment
  98. for rows.Next() {
  99. var comment models.TicketComment
  100. err := rows.Scan(&comment.ID, &comment.TicketID, &comment.UserID, &comment.Content, &comment.CreatedAt)
  101. if err != nil {
  102. return nil, models.NewErrInternalServer("failed to scan ticket comment row", err)
  103. }
  104. comments = append(comments, comment)
  105. }
  106. if err = rows.Err(); err != nil {
  107. return nil, models.NewErrInternalServer(fmt.Sprintf("error iterating ticket comment rows for ticket ID %d", ticketID), err)
  108. }
  109. return comments, nil
  110. }