mirror of
https://github.com/apricote/Listory.git
synced 2026-01-13 21:21:02 +00:00
feat(api): filter recent listens by timespan
This commit is contained in:
parent
c545699f22
commit
c9030937e2
5 changed files with 48 additions and 6 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue