156 lines
2.6 KiB
Go
156 lines
2.6 KiB
Go
package database
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type Video struct {
|
|
ID uuid.UUID `json:"id"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
ThumbnailURL *string `json:"thumbnail_url"`
|
|
VideoURL *string `json:"video_url"`
|
|
CreateVideoParams
|
|
}
|
|
|
|
type CreateVideoParams struct {
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
UserID uuid.UUID `json:"user_id"`
|
|
}
|
|
|
|
func (c Client) GetVideos(userID uuid.UUID) ([]Video, error) {
|
|
query := `
|
|
SELECT
|
|
id,
|
|
created_at,
|
|
updated_at,
|
|
title,
|
|
description,
|
|
thumbnail_url,
|
|
video_url,
|
|
user_id
|
|
FROM videos
|
|
WHERE user_id = ?
|
|
ORDER BY created_at DESC
|
|
`
|
|
|
|
rows, err := c.db.Query(query, userID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
videos := []Video{}
|
|
for rows.Next() {
|
|
var video Video
|
|
if err := rows.Scan(
|
|
&video.ID,
|
|
&video.CreatedAt,
|
|
&video.UpdatedAt,
|
|
&video.Title,
|
|
&video.Description,
|
|
&video.ThumbnailURL,
|
|
&video.VideoURL,
|
|
&video.UserID,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
videos = append(videos, video)
|
|
}
|
|
|
|
return videos, nil
|
|
}
|
|
|
|
func (c Client) CreateVideo(params CreateVideoParams) (Video, error) {
|
|
id := uuid.New()
|
|
query := `
|
|
INSERT INTO videos (
|
|
id,
|
|
created_at,
|
|
updated_at,
|
|
title,
|
|
description,
|
|
user_id
|
|
) VALUES (?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?, ?, ?)
|
|
`
|
|
_, err := c.db.Exec(query, id, params.Title, params.Description, params.UserID)
|
|
if err != nil {
|
|
return Video{}, err
|
|
}
|
|
|
|
return c.GetVideo(id)
|
|
}
|
|
|
|
func (c Client) GetVideo(id uuid.UUID) (Video, error) {
|
|
query := `
|
|
SELECT
|
|
id,
|
|
created_at,
|
|
updated_at,
|
|
title,
|
|
description,
|
|
thumbnail_url,
|
|
video_url,
|
|
user_id
|
|
FROM videos
|
|
WHERE id = ?
|
|
`
|
|
|
|
var video Video
|
|
err := c.db.QueryRow(query, id).Scan(
|
|
&video.ID,
|
|
&video.CreatedAt,
|
|
&video.UpdatedAt,
|
|
&video.Title,
|
|
&video.Description,
|
|
&video.ThumbnailURL,
|
|
&video.VideoURL,
|
|
&video.UserID)
|
|
if err != nil {
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return Video{}, nil
|
|
}
|
|
return Video{}, err
|
|
}
|
|
|
|
return video, nil
|
|
}
|
|
|
|
func (c Client) UpdateVideo(video Video) error {
|
|
query := `
|
|
UPDATE videos
|
|
SET
|
|
title = ?,
|
|
description = ?,
|
|
thumbnail_url = ?,
|
|
video_url = ?,
|
|
user_id = ?
|
|
WHERE id = ?
|
|
`
|
|
|
|
_, err := c.db.Exec(
|
|
query,
|
|
video.Title,
|
|
video.Description,
|
|
&video.ThumbnailURL,
|
|
&video.VideoURL,
|
|
video.UserID,
|
|
video.ID,
|
|
)
|
|
return err
|
|
}
|
|
|
|
func (c Client) DeleteVideo(id uuid.UUID) error {
|
|
query := `
|
|
DELETE FROM videos
|
|
WHERE id = ?
|
|
`
|
|
_, err := c.db.Exec(query, id)
|
|
return err
|
|
}
|