package services import ( "context" "quyun/v2/app/http/dto" "quyun/v2/app/requests" "quyun/v2/database" "quyun/v2/database/models" "quyun/v2/pkg/fields" "github.com/pkg/errors" "go.ipao.vip/gen" ) // @provider type media struct{} func (m *media) List(ctx context.Context, filter *dto.ListQuery) (*requests.Pager, error) { filter.Format() tbl, query := models.MediumQuery.QueryContext(ctx) query = query.Order(tbl.ID.Desc()) if filter.Keyword != nil && *filter.Keyword != "" { query = query.Where(tbl.Name.Like(database.WrapLike(*filter.Keyword))) } items, cnt, err := query.FindByPage(int(filter.Offset()), int(filter.Limit)) if err != nil { return nil, errors.Wrap(err, "failed to list media items") } return &requests.Pager{ Items: items, Total: cnt, Pagination: *filter.Pagination, }, nil } // GetByIds func (m *media) GetByIds(ctx context.Context, ids []int64) ([]*models.Medium, error) { if len(ids) == 0 { return []*models.Medium{}, nil } tbl, query := models.MediumQuery.QueryContext(ctx) items, err := query. Where(tbl.ID.In(ids...)). Find() if err != nil { return nil, errors.Wrap(err, "failed to get media items by ids") } return items, nil } // GetByHash func (m *media) GetByHash(ctx context.Context, hash string) (*models.Medium, error) { tbl, query := models.MediumQuery.QueryContext(ctx) item, err := query. Where(tbl.Hash.Eq(hash)). First() if err != nil { return nil, errors.Wrap(err, "failed to get media item by hash") } return item, nil } // UpdateMetas func (m *media) UpdateMetas(ctx context.Context, id int64, metas fields.MediaMetas) error { tbl, query := models.MediumQuery.QueryContext(ctx) _, err := query. Where(tbl.ID.Eq(id)). Update(tbl.Metas, metas) if err != nil { return errors.Wrapf(err, "failed to update media metas for id: %d", id) } return nil } // GetRelationMedias func (m *media) GetRelations(ctx context.Context, hash string) ([]*models.Medium, error) { tbl, query := models.MediumQuery.QueryContext(ctx) return query.Where(tbl.Metas.KeyEq("parent_hash", hash)).Find() } // FindByID func (m *media) FindByID(ctx context.Context, id int64) (*models.Medium, error) { tbl, query := models.MediumQuery.QueryContext(ctx) item, err := query.Where(tbl.ID.Eq(id)).First() if err != nil { return nil, errors.Wrapf(err, "failed to find media by id: %d", id) } return item, nil } // Count func (m *media) Count(ctx context.Context, conds ...gen.Condition) (int64, error) { _, query := models.MediumQuery.QueryContext(ctx) if len(conds) > 0 { query = query.Where(conds...) } return query.Count() }