Filter by category (#720)

* get videos with specific category (api)

* update api doc with category

* add url parameter to filter by category

* fix lint issues
pull/735/merge
PhieF 2018-06-27 14:24:49 +02:00 committed by Chocobozzz
parent adc236fee3
commit 61b909b9bf
8 changed files with 30 additions and 9 deletions

View File

@ -24,6 +24,7 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy {
totalItems: null
}
sort: VideoSortField = '-publishedAt'
category?: number
defaultSort: VideoSortField = '-publishedAt'
syndicationItems = []
@ -167,7 +168,7 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy {
protected loadRouteParams (routeParams: { [ key: string ]: any }) {
this.sort = routeParams['sort'] as VideoSortField || this.defaultSort
this.category = routeParams['category']
if (routeParams['page'] !== undefined) {
this.pagination.currentPage = parseInt(routeParams['page'], 10)
} else {

View File

@ -158,7 +158,8 @@ export class VideoService {
getVideos (
videoPagination: ComponentPagination,
sort: VideoSortField,
filter?: VideoFilter
filter?: VideoFilter,
category?: number
): Observable<{ videos: Video[], totalVideos: number }> {
const pagination = this.restService.componentPaginationToRestPagination(videoPagination)
@ -169,6 +170,10 @@ export class VideoService {
params = params.set('filter', filter)
}
if (category) {
params = params.set('category', category + '')
}
return this.authHttp
.get<ResultList<Video>>(VideoService.BASE_VIDEO_URL, { params })
.pipe(
@ -202,11 +207,13 @@ export class VideoService {
return feeds
}
getVideoFeedUrls (sort: VideoSortField, filter?: VideoFilter) {
getVideoFeedUrls (sort: VideoSortField, filter?: VideoFilter, category?: number) {
let params = this.restService.addRestGetParams(new HttpParams(), undefined, sort)
if (filter) params = params.set('filter', filter)
if (category) params = params.set('category', category + '')
return this.buildBaseFeedUrls(params)
}

View File

@ -50,10 +50,10 @@ export class VideoLocalComponent extends AbstractVideoList implements OnInit, On
getVideosObservable (page: number) {
const newPagination = immutableAssign(this.pagination, { currentPage: page })
return this.videoService.getVideos(newPagination, this.sort, this.filter)
return this.videoService.getVideos(newPagination, this.sort, this.filter, this.category)
}
generateSyndicationList () {
this.syndicationItems = this.videoService.getVideoFeedUrls(this.sort, this.filter)
this.syndicationItems = this.videoService.getVideoFeedUrls(this.sort, this.filter, this.category)
}
}

View File

@ -48,10 +48,10 @@ export class VideoRecentlyAddedComponent extends AbstractVideoList implements On
getVideosObservable (page: number) {
const newPagination = immutableAssign(this.pagination, { currentPage: page })
return this.videoService.getVideos(newPagination, this.sort)
return this.videoService.getVideos(newPagination, this.sort, undefined, this.category)
}
generateSyndicationList () {
this.syndicationItems = this.videoService.getVideoFeedUrls(this.sort)
this.syndicationItems = this.videoService.getVideoFeedUrls(this.sort, undefined, this.category)
}
}

View File

@ -47,10 +47,10 @@ export class VideoTrendingComponent extends AbstractVideoList implements OnInit,
getVideosObservable (page: number) {
const newPagination = immutableAssign(this.pagination, { currentPage: page })
return this.videoService.getVideos(newPagination, this.sort)
return this.videoService.getVideos(newPagination, this.sort, undefined, this.category)
}
generateSyndicationList () {
this.syndicationItems = this.videoService.getVideoFeedUrls(this.sort)
this.syndicationItems = this.videoService.getVideoFeedUrls(this.sort, undefined, this.category)
}
}

View File

@ -407,6 +407,7 @@ async function listVideos (req: express.Request, res: express.Response, next: ex
start: req.query.start,
count: req.query.count,
sort: req.query.sort,
category: req.query.category,
hideNSFW: isNSFWHidden(res),
filter: req.query.filter as VideoFilter,
withFiles: false

View File

@ -106,6 +106,7 @@ export enum ScopeNames {
actorId: number,
hideNSFW: boolean,
filter?: VideoFilter,
category?: number,
withFiles?: boolean,
accountId?: number,
videoChannelId?: number
@ -215,6 +216,10 @@ export enum ScopeNames {
query.where['nsfw'] = false
}
if (options.category) {
query.where['category'] = options.category
}
if (options.accountId) {
accountInclude.where = {
id: options.accountId
@ -730,6 +735,7 @@ export class VideoModel extends Model<VideoModel> {
sort: string,
hideNSFW: boolean,
withFiles: boolean,
category?: number,
filter?: VideoFilter,
accountId?: number,
videoChannelId?: number
@ -746,6 +752,7 @@ export class VideoModel extends Model<VideoModel> {
ScopeNames.AVAILABLE_FOR_LIST, {
actorId: serverActor.id,
hideNSFW: options.hideNSFW,
category: options.category,
filter: options.filter,
withFiles: options.withFiles,
accountId: options.accountId,

View File

@ -529,6 +529,11 @@ paths:
produces:
- application/json
parameters:
- name: category
in: query
required: false
type: number
description: category id of the video
- name: start
in: query
required: false