kv-netflix/backend/internal/database/database.go

85 lines
1.9 KiB
Go

package database
import (
"log"
"streamflow-backend/internal/models"
"github.com/glebarez/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var DB *gorm.DB
func InitDB(dsn string) {
var err error
DB, err = gorm.Open(sqlite.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
if err != nil {
log.Fatal("Failed to connect to database:", err)
}
log.Println("Database connection established")
// Auto-migrate schema
err = DB.AutoMigrate(&models.Video{})
if err != nil {
log.Fatal("Failed to migrate database:", err)
}
}
type VideoRepository struct {
db *gorm.DB
}
func NewVideoRepository(db *gorm.DB) *VideoRepository {
return &VideoRepository{db: db}
}
func (r *VideoRepository) Create(video *models.Video) error {
return r.db.Create(video).Error
}
func (r *VideoRepository) GetByID(id uint) (*models.Video, error) {
var video models.Video
err := r.db.First(&video, id).Error
return &video, err
}
func (r *VideoRepository) GetBySourceURL(url string) (*models.Video, error) {
var video models.Video
err := r.db.Where("source_url = ?", url).First(&video).Error
return &video, err
}
func (r *VideoRepository) Search(query string, limit int) ([]models.Video, error) {
var videos []models.Video
err := r.db.Where("title LIKE ?", "%"+query+"%").Limit(limit).Find(&videos).Error
return videos, err
}
func (r *VideoRepository) GetAll(skip int, limit int) ([]models.Video, error) {
var videos []models.Video
err := r.db.Offset(skip).Limit(limit).Find(&videos).Error
return videos, err
}
func (r *VideoRepository) Update(id uint, updates map[string]interface{}) (*models.Video, error) {
var video models.Video
result := r.db.First(&video, id)
if result.Error != nil {
return nil, result.Error
}
err := r.db.Model(&video).Updates(updates).Error
if err != nil {
return nil, err
}
return &video, nil
}
func (r *VideoRepository) Delete(id uint) error {
return r.db.Delete(&models.Video{}, id).Error
}