123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- package dbstore
- import (
- "context"
- "database/sql"
- "fmt"
- "git.linuxforward.com/byop/byop-engine/models"
- "github.com/pkg/errors"
- )
- // CreateTicket creates a new ticket
- func (s *SQLiteStore) CreateTicket(ctx context.Context, ticket *models.Ticket) error {
- query := `INSERT INTO tickets (client_id, title, description, status, priority, assigned_to) VALUES (?, ?, ?, ?, ?, ?)`
- result, err := s.db.ExecContext(ctx, query, ticket.ClientID, ticket.Title, ticket.Description, ticket.Status, ticket.Priority, ticket.AssignedTo)
- if err != nil {
- return models.NewErrInternalServer("failed to create ticket", err)
- }
- id, err := result.LastInsertId()
- if err != nil {
- return models.NewErrInternalServer("failed to get last insert ID for ticket", err)
- }
- ticket.ID = int(id)
- return nil
- }
- // GetTicketByID retrieves a ticket by its ID
- func (s *SQLiteStore) GetTicketByID(ctx context.Context, id int) (*models.Ticket, error) {
- query := `SELECT id, client_id, title, description, status, priority, assigned_to, created_at, updated_at FROM tickets WHERE id = ?`
- row := s.db.QueryRowContext(ctx, query, id)
- ticket := &models.Ticket{}
- err := row.Scan(&ticket.ID, &ticket.ClientID, &ticket.Title, &ticket.Description, &ticket.Status, &ticket.Priority, &ticket.AssignedTo, &ticket.CreatedAt, &ticket.UpdatedAt)
- if err != nil {
- if errors.Is(err, sql.ErrNoRows) {
- return nil, models.NewErrNotFound(fmt.Sprintf("ticket with ID %d not found", id), err)
- }
- return nil, models.NewErrInternalServer(fmt.Sprintf("failed to get ticket with ID %d", id), err)
- }
- return ticket, nil
- }
- // GetTickets retrieves all tickets
- func (s *SQLiteStore) GetTickets(ctx context.Context) ([]models.Ticket, error) {
- query := `SELECT id, client_id, title, description, status, priority, assigned_to, created_at, updated_at FROM tickets`
- rows, err := s.db.QueryContext(ctx, query)
- if err != nil {
- return nil, models.NewErrInternalServer("failed to query tickets", err)
- }
- defer rows.Close()
- var tickets []models.Ticket
- for rows.Next() {
- var ticket models.Ticket
- err := rows.Scan(&ticket.ID, &ticket.ClientID, &ticket.Title, &ticket.Description, &ticket.Status, &ticket.Priority, &ticket.AssignedTo, &ticket.CreatedAt, &ticket.UpdatedAt)
- if err != nil {
- return nil, models.NewErrInternalServer("failed to scan ticket row", err)
- }
- tickets = append(tickets, ticket)
- }
- if err = rows.Err(); err != nil {
- return nil, models.NewErrInternalServer("error iterating ticket rows", err)
- }
- return tickets, nil
- }
- // UpdateTicket updates an existing ticket
- func (s *SQLiteStore) UpdateTicket(ctx context.Context, ticket *models.Ticket) error {
- query := `UPDATE tickets SET client_id = ?, title = ?, description = ?, status = ?, priority = ?, assigned_to = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?`
- result, err := s.db.ExecContext(ctx, query, ticket.ClientID, ticket.Title, ticket.Description, ticket.Status, ticket.Priority, ticket.AssignedTo, ticket.ID)
- if err != nil {
- return models.NewErrInternalServer(fmt.Sprintf("failed to update ticket with ID %d", ticket.ID), err)
- }
- rowsAffected, err := result.RowsAffected()
- if err != nil {
- return models.NewErrInternalServer(fmt.Sprintf("failed to get rows affected for ticket update ID %d", ticket.ID), err)
- }
- if rowsAffected == 0 {
- return models.NewErrNotFound(fmt.Sprintf("ticket with ID %d not found for update", ticket.ID), nil)
- }
- return nil
- }
- // CreateTicketComment creates a new comment for a ticket
- func (s *SQLiteStore) CreateTicketComment(ctx context.Context, comment *models.TicketComment) error {
- query := `INSERT INTO ticket_comments (ticket_id, user_id, comment) VALUES (?, ?, ?)`
- result, err := s.db.ExecContext(ctx, query, comment.TicketID, comment.UserID, comment.Content)
- if err != nil {
- return models.NewErrInternalServer("failed to create ticket comment", err)
- }
- id, err := result.LastInsertId()
- if err != nil {
- return models.NewErrInternalServer("failed to get last insert ID for ticket comment", err)
- }
- comment.ID = int(id)
- return nil
- }
- // GetTicketComments retrieves all comments for a given ticket ID
- func (s *SQLiteStore) GetTicketComments(ctx context.Context, ticketID int) ([]models.TicketComment, error) {
- query := `SELECT id, ticket_id, user_id, comment, created_at FROM ticket_comments WHERE ticket_id = ? ORDER BY created_at ASC`
- rows, err := s.db.QueryContext(ctx, query, ticketID)
- if err != nil {
- return nil, models.NewErrInternalServer(fmt.Sprintf("failed to query ticket comments for ticket ID %d", ticketID), err)
- }
- defer rows.Close()
- var comments []models.TicketComment
- for rows.Next() {
- var comment models.TicketComment
- err := rows.Scan(&comment.ID, &comment.TicketID, &comment.UserID, &comment.Content, &comment.CreatedAt)
- if err != nil {
- return nil, models.NewErrInternalServer("failed to scan ticket comment row", err)
- }
- comments = append(comments, comment)
- }
- if err = rows.Err(); err != nil {
- return nil, models.NewErrInternalServer(fmt.Sprintf("error iterating ticket comment rows for ticket ID %d", ticketID), err)
- }
- return comments, nil
- }
|