feat(api): filter recent listens by timespan

This commit is contained in:
Julian Tölle 2020-05-09 16:28:57 +02:00
parent c545699f22
commit c9030937e2
5 changed files with 48 additions and 6 deletions

View file

@ -1,5 +1,26 @@
import { IsOptional, ValidateNested, IsISO8601 } from "class-validator";
import { User } from "src/users/user.entity";
export interface GetListensDto {
user: User;
// tslint:disable-next-line: max-classes-per-file
export class GetListensFilterTimeDto {
@IsISO8601()
start: string;
@IsISO8601()
end: string;
}
// tslint:disable-next-line: max-classes-per-file
export class GetListensFilterDto {
@IsOptional()
@ValidateNested()
time?: GetListensFilterTimeDto;
}
// tslint:disable-next-line: max-classes-per-file
export class GetListensDto {
user: User;
@IsOptional()
@ValidateNested()
filter?: GetListensFilterDto;
}

View file

@ -3,6 +3,7 @@ import { Pagination } from "nestjs-typeorm-paginate";
import { Auth } from "../auth/decorators/auth.decorator";
import { ReqUser } from "../auth/decorators/req-user.decorator";
import { User } from "../users/user.entity";
import { GetListensFilterDto } from "./dto/get-listens.dto";
import { Listen } from "./listen.entity";
import { ListensService } from "./listens.service";
@ -15,10 +16,11 @@ export class ListensController {
async getRecentlyPlayed(
@Query("page") page: number = 1,
@Query("limit") limit: number = 10,
@Query("filter") filter: GetListensFilterDto,
@ReqUser() user: User
): Promise<Pagination<Listen>> {
limit = limit > 100 ? 100 : limit;
return this.listensService.getListens({ page, limit, user });
return this.listensService.getListens({ page, limit, user, filter });
}
}

View file

@ -1,13 +1,14 @@
import { Injectable } from "@nestjs/common";
import { getTime, parseISO, getUnixTime } from "date-fns";
import {
IPaginationOptions,
paginate,
Pagination,
} from "nestjs-typeorm-paginate";
import { CreateListenDto } from "./dto/create-listen.dto";
import { GetListensDto } from "./dto/get-listens.dto";
import { Listen } from "./listen.entity";
import { ListenRepository } from "./listen.repository";
import { GetListensDto } from "./dto/get-listens.dto";
@Injectable()
export class ListensService {
@ -42,9 +43,9 @@ export class ListensService {
async getListens(
options: GetListensDto & IPaginationOptions
): Promise<Pagination<Listen>> {
const { page, limit, user } = options;
const { page, limit, user, filter } = options;
const queryBuilder = this.listenRepository
let queryBuilder = this.listenRepository
.createQueryBuilder("l")
.leftJoin("l.user", "user")
.where("user.id = :userID", { userID: user.id })
@ -54,6 +55,18 @@ export class ListensService {
.leftJoinAndSelect("album.artists", "albumArtists")
.orderBy("l.playedAt", "DESC");
if (filter) {
if (filter.time) {
queryBuilder = queryBuilder.andWhere(
"l.playedAt BETWEEN :timeStart AND :timeEnd",
{
timeStart: parseISO(filter.time.start),
timeEnd: parseISO(filter.time.end),
}
);
}
}
return paginate<Listen>(queryBuilder, {
page,
limit,