113 lines
3.3 KiB
Go
113 lines
3.3 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
dbgen "Yimaru-Backend/gen/db"
|
|
"Yimaru-Backend/internal/domain"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
func examPrepCatalogCourseToDomain(c dbgen.ExamPrepCatalogCourse) domain.ExamPrepCatalogCourse {
|
|
out := domain.ExamPrepCatalogCourse{
|
|
ID: c.ID,
|
|
Name: c.Name,
|
|
SortOrder: int(c.SortOrder),
|
|
}
|
|
out.Description = fromPgText(c.Description)
|
|
out.Thumbnail = fromPgText(c.Thumbnail)
|
|
out.CreatedAt = c.CreatedAt.Time
|
|
if c.UpdatedAt.Valid {
|
|
t := c.UpdatedAt.Time
|
|
out.UpdatedAt = &t
|
|
}
|
|
return out
|
|
}
|
|
|
|
func (s *Store) CreateExamPrepCatalogCourse(ctx context.Context, input domain.CreateExamPrepCatalogCourseInput) (domain.ExamPrepCatalogCourse, error) {
|
|
c, err := s.queries.ExamPrepCreateCatalogCourse(ctx, dbgen.ExamPrepCreateCatalogCourseParams{
|
|
Name: input.Name,
|
|
Description: toPgText(input.Description),
|
|
Thumbnail: toPgText(input.Thumbnail),
|
|
})
|
|
if err != nil {
|
|
return domain.ExamPrepCatalogCourse{}, err
|
|
}
|
|
return examPrepCatalogCourseToDomain(c), nil
|
|
}
|
|
|
|
func (s *Store) GetExamPrepCatalogCourseByID(ctx context.Context, id int64) (domain.ExamPrepCatalogCourse, error) {
|
|
c, err := s.queries.ExamPrepGetCatalogCourseByID(ctx, id)
|
|
if err != nil {
|
|
if errors.Is(err, pgx.ErrNoRows) {
|
|
return domain.ExamPrepCatalogCourse{}, pgx.ErrNoRows
|
|
}
|
|
return domain.ExamPrepCatalogCourse{}, err
|
|
}
|
|
return examPrepCatalogCourseToDomain(c), nil
|
|
}
|
|
|
|
func (s *Store) ListExamPrepCatalogCourses(ctx context.Context, limit, offset int32) ([]domain.ExamPrepCatalogCourse, int64, error) {
|
|
rows, err := s.queries.ExamPrepListCatalogCourses(ctx, dbgen.ExamPrepListCatalogCoursesParams{
|
|
Limit: limit,
|
|
Offset: offset,
|
|
})
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
if len(rows) == 0 {
|
|
return []domain.ExamPrepCatalogCourse{}, 0, nil
|
|
}
|
|
var total int64
|
|
out := make([]domain.ExamPrepCatalogCourse, 0, len(rows))
|
|
for i, r := range rows {
|
|
if i == 0 {
|
|
total = r.TotalCount
|
|
}
|
|
out = append(out, examPrepCatalogCourseToDomain(dbgen.ExamPrepCatalogCourse{
|
|
ID: r.ID,
|
|
Name: r.Name,
|
|
Description: r.Description,
|
|
Thumbnail: r.Thumbnail,
|
|
SortOrder: r.SortOrder,
|
|
CreatedAt: r.CreatedAt,
|
|
UpdatedAt: r.UpdatedAt,
|
|
}))
|
|
}
|
|
return out, total, nil
|
|
}
|
|
|
|
func (s *Store) ListAllExamPrepCatalogCourseIDs(ctx context.Context) ([]int64, error) {
|
|
return s.queries.ExamPrepListAllCatalogCourseIDs(ctx)
|
|
}
|
|
|
|
func (s *Store) UpdateExamPrepCatalogCourse(ctx context.Context, id int64, input domain.UpdateExamPrepCatalogCourseInput) (domain.ExamPrepCatalogCourse, error) {
|
|
var nameText pgtype.Text
|
|
if input.Name != nil {
|
|
nameText = pgtype.Text{String: *input.Name, Valid: true}
|
|
} else {
|
|
nameText = pgtype.Text{Valid: false}
|
|
}
|
|
c, err := s.queries.ExamPrepUpdateCatalogCourse(ctx, dbgen.ExamPrepUpdateCatalogCourseParams{
|
|
ID: id,
|
|
Name: nameText,
|
|
Description: optionalTextUpdate(input.Description),
|
|
Thumbnail: optionalTextUpdate(input.Thumbnail),
|
|
SortOrder: optionalInt4Update(input.SortOrder),
|
|
})
|
|
if err != nil {
|
|
if errors.Is(err, pgx.ErrNoRows) {
|
|
return domain.ExamPrepCatalogCourse{}, pgx.ErrNoRows
|
|
}
|
|
return domain.ExamPrepCatalogCourse{}, err
|
|
}
|
|
return examPrepCatalogCourseToDomain(c), nil
|
|
}
|
|
|
|
func (s *Store) DeleteExamPrepCatalogCourse(ctx context.Context, id int64) error {
|
|
return s.queries.ExamPrepDeleteCatalogCourse(ctx, id)
|
|
}
|