package store import ( "context" "database/sql" ) type Comment struct { ID int64 `json:"id"` PostID int64 `json:"post_id"` UserID int64 `json:"user_id"` Content string `json:"content"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` User User `json:"user"` } type CommentStore struct { db *sql.DB } func (s *CommentStore) Create(ctx context.Context, c *Comment) error { query := `INSERT INTO comments (post_id, user_id, content) VALUES ($1, $2, $3) RETURNING id, created_at, updated_at;` ctx, cancel := context.WithTimeout(ctx, QueryTimeout) defer cancel() err := s.db.QueryRowContext(ctx, query, c.PostID, c.UserID, c.Content).Scan(&c.ID, &c.CreatedAt, &c.UpdatedAt) if err != nil { return err } return nil } func (s *CommentStore) GetByPostID(ctx context.Context, postID int64) ([]Comment, error) { query := `SELECT c.id, c.post_id, c.user_id, c.content, c.created_at, users.username, users.id FROM comments c JOIN users on c.user_id = users.id WHERE c.post_id = $1 ORDER BY c.created_at DESC; ` ctx, cancel := context.WithTimeout(ctx, QueryTimeout) defer cancel() rows, err := s.db.QueryContext(ctx, query, postID) if err != nil { return nil, err } defer rows.Close() comments := []Comment{} for rows.Next() { var comment Comment comment.User = User{} err := rows.Scan( &comment.ID, &comment.PostID, &comment.UserID, &comment.Content, &comment.CreatedAt, &comment.User.Username, &comment.User.ID, ) if err != nil { return nil, err } comments = append(comments, comment) } return comments, nil }