Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions client/src/api/items.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,15 @@ export const useItems = (args: Items.Paginated.RequestQuery) => {
};
};

export const useRandomItem = (args: Items.Random.RequestQuery) => {
export const useRandomItemFromWatchlist = (args: Items.Random.RequestQuery) => {
const { error, data, isFetched } = useQuery(
['randomItems', args],
async () => mediaTrackerApi.items.random(args),
async () =>
mediaTrackerApi.items.random({
...args,
onlyOnWatchlist: true,
onlyReleased: true,
}),
{
keepPreviousData: true,
}
Expand Down
13 changes: 10 additions & 3 deletions client/src/components/PaginatedGridItems.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import { GridItemAppearanceArgs, GridItem } from 'src/components/GridItem';
import { useOrderByComponent } from 'src/components/OrderBy';
import { useFilterBy } from 'src/components/FilterBy';
import { useUpdateSearchParams } from 'src/hooks/updateSearchParamsHook';
import { CheckboxWithTitleAndDescription } from './Checkbox';
import { useShowRepeated } from './ShowRepeated';

const Search: FunctionComponent<{
Expand Down Expand Up @@ -85,8 +84,15 @@ export const PaginatedGridItems: FunctionComponent<{
isStatisticsPage?: boolean;
showSearch?: boolean;
gridItemAppearance?: GridItemAppearanceArgs;
disableShowRepeated?: boolean;
}> = (props) => {
const { args, showSortOrderControls, showSearch, gridItemAppearance } = props;
const {
args,
showSortOrderControls,
showSearch,
gridItemAppearance,
disableShowRepeated,
} = props;

const [searchParams, setSearchParams] = useSearchParams();
const [searchQuery, setSearchQuery] = useState<string>();
Expand Down Expand Up @@ -120,7 +126,8 @@ export const PaginatedGridItems: FunctionComponent<{
const { showRepeated, ShowRepeatedComponenet } = useShowRepeated(
props.isStatisticsPage,
filter,
orderBy
orderBy,
disableShowRepeated ?? false
);

const mainContainerRef = useRef<HTMLDivElement>();
Expand Down
8 changes: 5 additions & 3 deletions client/src/components/ShowRepeated.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import { MediaItemOrderBy } from 'mediatracker-api';
export const useShowRepeated = (
isStatisticsPage: boolean,
filter: unknown,
orderBy: MediaItemOrderBy
orderBy: MediaItemOrderBy,
disable: boolean
) => {
const { currentValue, updateSearchParams } = useUpdateSearchParams<boolean>({
filterParam: 'showRepeated',
Expand All @@ -26,7 +27,8 @@ export const useShowRepeated = (
if (
orderBy !== 'lastSeen' ||
isStatisticsPage ||
filter['onlyOnWatchlist'] === true
filter['onlyOnWatchlist'] === true ||
disable
) {
handleToggle(false);
return true;
Expand All @@ -35,7 +37,7 @@ export const useShowRepeated = (
};

return {
showRepeated: showRepeated,
showRepeated: disable ? disable : showRepeated,
ShowRepeatedComponenet: () => {
if (hideComponenet()) {
return null;
Expand Down
12 changes: 6 additions & 6 deletions client/src/pages/Random.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { MediaType } from 'mediatracker-api';
import React, { FunctionComponent, useEffect, useState } from 'react';
import { useItems, useRandomItem } from 'src/api/items';
import { useItems, useRandomItemFromWatchlist } from 'src/api/items';
import { Segment } from './Home';
import { t } from '@lingui/macro';

Expand All @@ -13,19 +13,19 @@ const mediaTypes: { [mediaType in MediaType]: string } = {
};

export const Random: FunctionComponent = () => {
const { items: randomMovie } = useRandomItem({
const { items: randomMovie } = useRandomItemFromWatchlist({
mediaType: 'movie',
});
const { items: randomTv } = useRandomItem({
const { items: randomTv } = useRandomItemFromWatchlist({
mediaType: 'tv',
});
const { items: randomVideoGame } = useRandomItem({
const { items: randomVideoGame } = useRandomItemFromWatchlist({
mediaType: 'video_game',
});
const { items: randomBook } = useRandomItem({
const { items: randomBook } = useRandomItemFromWatchlist({
mediaType: 'book',
});
const { items: randomAudioBook } = useRandomItem({
const { items: randomAudioBook } = useRandomItemFromWatchlist({
mediaType: 'audiobook',
});

Expand Down
1 change: 1 addition & 0 deletions client/src/pages/WatchlistPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export const WatchlistPage: FunctionComponent = () => {
onlyOnWatchlist: true,
}}
showSortOrderControls={true}
disableShowRepeated={true}
showSearch={false}
gridItemAppearance={{
showRating: true,
Expand Down
24 changes: 20 additions & 4 deletions server/__tests__/__utils__/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,15 @@ export class Data {
return result;
};

static generateMovies = (count: number, start: number) => {
static generateMovies = (count: number, start: number, inFuture = false) => {
const result = [];
for (let i = start; i < count + start; i++) {
result.push(this.generateMovie(i));
result.push(this.generateMovie(i, inFuture));
}
return result;
};

static generateMovie = (id: number) => {
static generateMovie = (id: number, inFuture: boolean) => {
const new_id = id;
return {
id: new_id,
Expand All @@ -52,7 +52,9 @@ export class Data {
title: 'movie' + new_id,
externalPosterUrl: 'posterUrl',
externalBackdropUrl: 'backdropUrl',
releaseDate: `${1971 + new_id}-04-12`,
releaseDate: `${
inFuture ? new Date().getFullYear() + new_id : 1971 + new_id
}-04-12`,
tmdbId: 123456 + new_id,
runtime: 124 + new_id,
};
Expand Down Expand Up @@ -271,6 +273,20 @@ export class Data {
addedAt: new Date().getTime(),
};

static addMoviesToWatchlist = (count: number, start: number) => {
const result = [];
for (let i = start; i < count + start; i++) {
const item = {
id: i + 1,
listId: Data.watchlist.id,
mediaItemId: i,
addedAt: new Date().getTime(),
};
result.push(item);
}
return result;
};

static list: List = {
id: 1,
createdAt: new Date().getTime(),
Expand Down
25 changes: 25 additions & 0 deletions server/__tests__/controllers/itmes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -470,4 +470,29 @@ describe('listItemController', () => {
5
);
});

test('should show items before today', async () => {
const itemsController = new ItemsController();
await Database.knex('list').insert(Data.watchlist);
await Database.knex('mediaItem').insert(Data.generateMovies(10, 0));
await Database.knex('listItem').insert(Data.addMoviesToWatchlist(10, 0));
await Database.knex('mediaItem').insert(Data.generateMovies(5, 10, true));
await Database.knex('listItem').insert(Data.addMoviesToWatchlist(5, 10));

const res = await request(itemsController.getPaginated, {
userId: Data.user.id,
requestQuery: {
mediaType: 'movie',
orderBy: 'lastSeen',
sortOrder: 'desc',
page: 1,
onlyReleased: true,
onlyOnWatchlist: true,
},
});

expect((res.data as Pagination<MediaItemItemsResponse>).data.length).toBe(
10
);
});
});
50 changes: 49 additions & 1 deletion server/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"openapi": "3.0.0",
"info": {
"title": "MediaTracker",
"version": "0.1.0",
"version": "0.2.0",
"license": {
"name": "MIT",
"url": "https://opensource.org/licenses/MIT"
Expand Down Expand Up @@ -408,6 +408,15 @@
"nullable": true
}
},
{
"name": "onlyReleased",
"in": "query",
"required": false,
"schema": {
"type": "boolean",
"nullable": true
}
},
{
"name": "year",
"in": "query",
Expand Down Expand Up @@ -622,6 +631,15 @@
"nullable": true
}
},
{
"name": "onlyReleased",
"in": "query",
"required": false,
"schema": {
"type": "boolean",
"nullable": true
}
},
{
"name": "year",
"in": "query",
Expand Down Expand Up @@ -696,6 +714,24 @@
],
"nullable": true
}
},
{
"name": "onlyOnWatchlist",
"in": "query",
"required": false,
"schema": {
"type": "boolean",
"nullable": true
}
},
{
"name": "onlyReleased",
"in": "query",
"required": false,
"schema": {
"type": "boolean",
"nullable": true
}
}
],
"responses": {
Expand Down Expand Up @@ -3878,6 +3914,10 @@
"type": "boolean",
"nullable": true
},
"onlyReleased": {
"type": "boolean",
"nullable": true
},
"year": {
"type": "string",
"nullable": true
Expand Down Expand Up @@ -3946,6 +3986,14 @@
}
],
"nullable": true
},
"onlyOnWatchlist": {
"type": "boolean",
"nullable": true
},
"onlyReleased": {
"type": "boolean",
"nullable": true
}
}
},
Expand Down
4 changes: 2 additions & 2 deletions server/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion server/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mediatracker-plus",
"version": "0.2.0",
"version": "0.2.1",
"description": "Self hosted media tracker for movies, tv shows, video games, books and audiobooks",
"repository": {
"type": "git",
Expand Down
11 changes: 8 additions & 3 deletions server/src/controllers/items.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export type GetItemsRequest = Omit<

export type GetRandomItemsRequest = Omit<
GetRandomItemsArgs,
'userId' | 'selectRandom' | 'onlyOnWatchlist'
'userId' | 'selectRandom'
>;

export class ItemsController {
Expand Down Expand Up @@ -46,6 +46,7 @@ export class ItemsController {
onlyWithoutUserRating,
onlyWithProgress,
showRepeated,
onlyReleased,
} = req.query;

const orderBy = req.query.orderBy || 'title';
Expand Down Expand Up @@ -74,6 +75,7 @@ export class ItemsController {
onlyWithProgress: onlyWithProgress,
showRepeated: showRepeated,
selectRandom: false,
onlyReleased: onlyReleased,
});

res.send(result);
Expand Down Expand Up @@ -102,6 +104,7 @@ export class ItemsController {
onlyWithUserRating,
onlyWithoutUserRating,
onlyWithProgress,
onlyReleased,
} = req.query;

const orderBy = req.query.orderBy || 'title';
Expand All @@ -120,6 +123,7 @@ export class ItemsController {
onlyWithUserRating: onlyWithUserRating,
onlyWithoutUserRating: onlyWithoutUserRating,
onlyWithProgress: onlyWithProgress,
onlyReleased: onlyReleased,
selectRandom: false,
});

Expand All @@ -139,13 +143,14 @@ export class ItemsController {
}>(async (req, res) => {
const userId = Number(req.user);

const { mediaType } = req.query;
const { mediaType, onlyOnWatchlist, onlyReleased } = req.query;

const result = await mediaItemRepository.items({
userId: userId,
mediaType: mediaType,
selectRandom: true,
onlyOnWatchlist: true,
onlyOnWatchlist: onlyOnWatchlist,
onlyReleased: onlyReleased,
});

res.send(result);
Expand Down
Loading
Loading