71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
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
|
|
}
|