293 lines
7.6 KiB
Go
293 lines
7.6 KiB
Go
package repository
|
|
|
|
import (
|
|
dbgen "Yimaru-Backend/gen/db"
|
|
"Yimaru-Backend/internal/domain"
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
func (s *Store) CreateSubCourseVideo(
|
|
ctx context.Context,
|
|
subCourseID int64,
|
|
title string,
|
|
description *string,
|
|
videoURL string,
|
|
duration int32,
|
|
resolution *string,
|
|
instructorID *string,
|
|
thumbnail *string,
|
|
visibility *string,
|
|
displayOrder *int32,
|
|
status *string,
|
|
vimeoID *string,
|
|
vimeoEmbedURL *string,
|
|
vimeoPlayerHTML *string,
|
|
vimeoStatus *string,
|
|
videoHostProvider *string,
|
|
) (domain.SubCourseVideo, error) {
|
|
var descText, resText, instrText, thumbText, visText, statusText pgtype.Text
|
|
var vimeoIDText, vimeoEmbedText, vimeoHTMLText, vimeoStatusText, hostProviderText pgtype.Text
|
|
|
|
if description != nil {
|
|
descText = pgtype.Text{String: *description, Valid: true}
|
|
}
|
|
if resolution != nil {
|
|
resText = pgtype.Text{String: *resolution, Valid: true}
|
|
}
|
|
if instructorID != nil {
|
|
instrText = pgtype.Text{String: *instructorID, Valid: true}
|
|
}
|
|
if thumbnail != nil {
|
|
thumbText = pgtype.Text{String: *thumbnail, Valid: true}
|
|
}
|
|
if visibility != nil {
|
|
visText = pgtype.Text{String: *visibility, Valid: true}
|
|
}
|
|
if status != nil {
|
|
statusText = pgtype.Text{String: *status, Valid: true}
|
|
}
|
|
if vimeoID != nil {
|
|
vimeoIDText = pgtype.Text{String: *vimeoID, Valid: true}
|
|
}
|
|
if vimeoEmbedURL != nil {
|
|
vimeoEmbedText = pgtype.Text{String: *vimeoEmbedURL, Valid: true}
|
|
}
|
|
if vimeoPlayerHTML != nil {
|
|
vimeoHTMLText = pgtype.Text{String: *vimeoPlayerHTML, Valid: true}
|
|
}
|
|
if vimeoStatus != nil {
|
|
vimeoStatusText = pgtype.Text{String: *vimeoStatus, Valid: true}
|
|
}
|
|
if videoHostProvider != nil {
|
|
hostProviderText = pgtype.Text{String: *videoHostProvider, Valid: true}
|
|
}
|
|
|
|
var dispOrder pgtype.Int4
|
|
if displayOrder != nil {
|
|
dispOrder = pgtype.Int4{Int32: *displayOrder, Valid: true}
|
|
}
|
|
|
|
row, err := s.queries.CreateSubCourseVideo(ctx, dbgen.CreateSubCourseVideoParams{
|
|
SubCourseID: subCourseID,
|
|
Title: title,
|
|
Description: descText,
|
|
VideoUrl: videoURL,
|
|
Duration: duration,
|
|
Resolution: resText,
|
|
InstructorID: instrText,
|
|
Thumbnail: thumbText,
|
|
Visibility: visText,
|
|
Column10: dispOrder,
|
|
Column11: statusText,
|
|
VimeoID: vimeoIDText,
|
|
VimeoEmbedUrl: vimeoEmbedText,
|
|
VimeoPlayerHtml: vimeoHTMLText,
|
|
Column15: vimeoStatusText,
|
|
Column16: hostProviderText,
|
|
})
|
|
if err != nil {
|
|
return domain.SubCourseVideo{}, err
|
|
}
|
|
|
|
return mapSubCourseVideoRow(row), nil
|
|
}
|
|
|
|
func (s *Store) GetSubCourseVideoByID(
|
|
ctx context.Context,
|
|
id int64,
|
|
) (domain.SubCourseVideo, error) {
|
|
row, err := s.queries.GetSubCourseVideoByID(ctx, id)
|
|
if err != nil {
|
|
return domain.SubCourseVideo{}, err
|
|
}
|
|
|
|
return mapSubCourseVideoRow(row), nil
|
|
}
|
|
|
|
func (s *Store) GetVideosBySubCourse(
|
|
ctx context.Context,
|
|
subCourseID int64,
|
|
) ([]domain.SubCourseVideo, int64, error) {
|
|
rows, err := s.queries.GetVideosBySubCourse(ctx, subCourseID)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
var (
|
|
videos []domain.SubCourseVideo
|
|
totalCount int64
|
|
)
|
|
|
|
for i, row := range rows {
|
|
if i == 0 {
|
|
totalCount = row.TotalCount
|
|
}
|
|
|
|
videos = append(videos, domain.SubCourseVideo{
|
|
ID: row.ID,
|
|
SubCourseID: row.SubCourseID,
|
|
Title: row.Title,
|
|
Description: ptrString(row.Description),
|
|
VideoURL: row.VideoUrl,
|
|
Duration: row.Duration,
|
|
Resolution: ptrString(row.Resolution),
|
|
InstructorID: ptrString(row.InstructorID),
|
|
Thumbnail: ptrString(row.Thumbnail),
|
|
Visibility: ptrString(row.Visibility),
|
|
DisplayOrder: row.DisplayOrder,
|
|
IsPublished: row.IsPublished,
|
|
PublishDate: ptrTimestamptz(row.PublishDate),
|
|
Status: row.Status,
|
|
VimeoID: ptrString(row.VimeoID),
|
|
VimeoEmbedURL: ptrString(row.VimeoEmbedUrl),
|
|
VimeoPlayerHTML: ptrString(row.VimeoPlayerHtml),
|
|
VimeoStatus: ptrString(row.VimeoStatus),
|
|
})
|
|
}
|
|
|
|
return videos, totalCount, nil
|
|
}
|
|
|
|
func (s *Store) GetPublishedVideosBySubCourse(
|
|
ctx context.Context,
|
|
subCourseID int64,
|
|
) ([]domain.SubCourseVideo, error) {
|
|
rows, err := s.queries.GetPublishedVideosBySubCourse(ctx, subCourseID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
videos := make([]domain.SubCourseVideo, 0, len(rows))
|
|
for _, row := range rows {
|
|
videos = append(videos, mapSubCourseVideoRow(row))
|
|
}
|
|
|
|
return videos, nil
|
|
}
|
|
|
|
func (s *Store) PublishSubCourseVideo(
|
|
ctx context.Context,
|
|
videoID int64,
|
|
) error {
|
|
return s.queries.PublishSubCourseVideo(ctx, videoID)
|
|
}
|
|
|
|
func (s *Store) UpdateSubCourseVideo(
|
|
ctx context.Context,
|
|
id int64,
|
|
title *string,
|
|
description *string,
|
|
videoURL *string,
|
|
duration *int32,
|
|
resolution *string,
|
|
visibility *string,
|
|
thumbnail *string,
|
|
displayOrder *int32,
|
|
status *string,
|
|
) error {
|
|
var titleVal, descVal, urlVal, resVal, visVal, thumbVal, statusVal string
|
|
var durationVal, dispOrderVal int32
|
|
|
|
if title != nil {
|
|
titleVal = *title
|
|
}
|
|
if description != nil {
|
|
descVal = *description
|
|
}
|
|
if videoURL != nil {
|
|
urlVal = *videoURL
|
|
}
|
|
if duration != nil {
|
|
durationVal = *duration
|
|
}
|
|
if resolution != nil {
|
|
resVal = *resolution
|
|
}
|
|
if visibility != nil {
|
|
visVal = *visibility
|
|
}
|
|
if thumbnail != nil {
|
|
thumbVal = *thumbnail
|
|
}
|
|
if displayOrder != nil {
|
|
dispOrderVal = *displayOrder
|
|
}
|
|
if status != nil {
|
|
statusVal = *status
|
|
}
|
|
|
|
return s.queries.UpdateSubCourseVideo(ctx, dbgen.UpdateSubCourseVideoParams{
|
|
Title: titleVal,
|
|
Description: pgtype.Text{String: descVal, Valid: description != nil},
|
|
VideoUrl: urlVal,
|
|
Duration: durationVal,
|
|
Resolution: pgtype.Text{String: resVal, Valid: resolution != nil},
|
|
Visibility: pgtype.Text{String: visVal, Valid: visibility != nil},
|
|
Thumbnail: pgtype.Text{String: thumbVal, Valid: thumbnail != nil},
|
|
DisplayOrder: dispOrderVal,
|
|
Status: statusVal,
|
|
ID: id,
|
|
})
|
|
}
|
|
|
|
func (s *Store) ArchiveSubCourseVideo(
|
|
ctx context.Context,
|
|
id int64,
|
|
) error {
|
|
return s.queries.ArchiveSubCourseVideo(ctx, id)
|
|
}
|
|
|
|
func (s *Store) DeleteSubCourseVideo(
|
|
ctx context.Context,
|
|
id int64,
|
|
) error {
|
|
return s.queries.DeleteSubCourseVideo(ctx, id)
|
|
}
|
|
|
|
func mapSubCourseVideoRow(row dbgen.SubCourseVideo) domain.SubCourseVideo {
|
|
return domain.SubCourseVideo{
|
|
ID: row.ID,
|
|
SubCourseID: row.SubCourseID,
|
|
Title: row.Title,
|
|
Description: ptrString(row.Description),
|
|
VideoURL: row.VideoUrl,
|
|
Duration: row.Duration,
|
|
Resolution: ptrString(row.Resolution),
|
|
InstructorID: ptrString(row.InstructorID),
|
|
Thumbnail: ptrString(row.Thumbnail),
|
|
Visibility: ptrString(row.Visibility),
|
|
DisplayOrder: row.DisplayOrder,
|
|
IsPublished: row.IsPublished,
|
|
PublishDate: ptrTimestamptz(row.PublishDate),
|
|
Status: row.Status,
|
|
VimeoID: ptrString(row.VimeoID),
|
|
VimeoEmbedURL: ptrString(row.VimeoEmbedUrl),
|
|
VimeoPlayerHTML: ptrString(row.VimeoPlayerHtml),
|
|
VimeoStatus: ptrString(row.VimeoStatus),
|
|
}
|
|
}
|
|
|
|
func (s *Store) UpdateVimeoStatus(ctx context.Context, videoID int64, status string) error {
|
|
return s.queries.UpdateVimeoStatus(ctx, dbgen.UpdateVimeoStatusParams{
|
|
VimeoStatus: pgtype.Text{String: status, Valid: true},
|
|
ID: videoID,
|
|
})
|
|
}
|
|
|
|
func (s *Store) GetVideoByVimeoID(ctx context.Context, vimeoID string) (domain.SubCourseVideo, error) {
|
|
row, err := s.queries.GetVideosByVimeoID(ctx, pgtype.Text{String: vimeoID, Valid: true})
|
|
if err != nil {
|
|
return domain.SubCourseVideo{}, err
|
|
}
|
|
return mapSubCourseVideoRow(row), nil
|
|
}
|
|
|
|
func (s *Store) ReorderSubCourseVideos(ctx context.Context, ids []int64, positions []int32) error {
|
|
return s.queries.ReorderSubCourseVideos(ctx, dbgen.ReorderSubCourseVideosParams{
|
|
Ids: ids,
|
|
Positions: positions,
|
|
})
|
|
}
|