103 lines
2.3 KiB
Go
103 lines
2.3 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/LazyBachelor/LazyPM/internal/models"
|
|
|
|
"github.com/steveyegge/beads"
|
|
)
|
|
|
|
type BeadsService struct {
|
|
beads.Storage
|
|
}
|
|
|
|
func NewBeadsService(ctx context.Context, storage beads.Storage, prefix string) (*BeadsService, error) {
|
|
issue_prefix, err := storage.GetConfig(ctx, "issue_prefix")
|
|
if err != nil || issue_prefix == "" {
|
|
if err := storage.SetConfig(ctx, "issue_prefix", prefix); err != nil {
|
|
return nil, fmt.Errorf("failed to set issue_prefix: %w", err)
|
|
}
|
|
fmt.Println("Initialized with prefix:", prefix)
|
|
}
|
|
|
|
return &BeadsService{
|
|
Storage: storage,
|
|
}, nil
|
|
}
|
|
|
|
func (s *BeadsService) AllIssues(ctx context.Context) ([]models.Issue, error) {
|
|
issuesPtr, err := s.Storage.SearchIssues(ctx, "", models.IssueFilter{})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(issuesPtr) == 0 {
|
|
return []models.Issue{}, nil
|
|
}
|
|
|
|
issues := models.IssuesPtrToIssues(issuesPtr)
|
|
|
|
return issues, nil
|
|
}
|
|
|
|
func (s *BeadsService) DeleteIssues() error {
|
|
|
|
var deleteIssues = "DELETE FROM issues;"
|
|
|
|
if _, err := s.UnderlyingDB().Exec(deleteIssues); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *BeadsService) GetComments(ctx context.Context, issueID string) ([]models.Comment, error) {
|
|
query := `SELECT id, issue_id, author, text, created_at FROM comments WHERE issue_id = ? ORDER BY created_at ASC LIMIT 100`
|
|
|
|
rows, err := s.UnderlyingDB().QueryContext(ctx, query, issueID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var comments []models.Comment
|
|
for rows.Next() {
|
|
var c models.Comment
|
|
if err := rows.Scan(&c.ID, &c.IssueID, &c.Author, &c.Text, &c.CreatedAt); err != nil {
|
|
return nil, err
|
|
}
|
|
comments = append(comments, c)
|
|
}
|
|
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return comments, nil
|
|
}
|
|
|
|
func (s *BeadsService) AddComment(ctx context.Context, issueID, author, text string) (*models.Comment, error) {
|
|
query := `INSERT INTO comments (issue_id, author, text, created_at) VALUES (?, ?, ?, ?)`
|
|
|
|
createdAt := time.Now().UTC()
|
|
result, err := s.UnderlyingDB().ExecContext(ctx, query, issueID, author, text, createdAt)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &models.Comment{
|
|
ID: id,
|
|
IssueID: issueID,
|
|
Author: author,
|
|
Text: text,
|
|
CreatedAt: createdAt,
|
|
}, nil
|
|
}
|