Skip to content

Commit f370f2e

Browse files
committed
fix(server): network/companies pages now return correct data
1 parent 2b02483 commit f370f2e

File tree

19 files changed

+372
-52
lines changed

19 files changed

+372
-52
lines changed

server/src/api/routes/movie.ts

+15-4
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,24 @@ const lookupByIdMinified = async (ctx: Context) => {
4040
};
4141

4242
const getMovieDiscovery = async (ctx: Context) => {
43-
const body = ctx.request.body as any;
43+
const service = getFromContainer(MovieService);
44+
const mapper = getFromContainer(MovieMapper);
4445

45-
const page = body.page ? body.page : 1;
46-
const { params } = body;
46+
const { page } = (ctx.request.body as any) || 1;
47+
const { with_companies } = ctx.query;
48+
49+
const results = await service.getDiscover({
50+
page,
51+
limit: 30,
52+
withCompanies: with_companies
53+
? parseInt(with_companies as string)
54+
: undefined,
55+
});
4756

4857
ctx.status = StatusCodes.OK;
49-
ctx.body = await discoverMovie(page, params);
58+
ctx.body = {
59+
results: results.map((movie) => mapper.toResponse(movie)),
60+
};
5061
};
5162

5263
const getCompanyById = async (ctx: Context) => {

server/src/api/routes/show.ts

+27-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ import { StatusCodes } from 'http-status-codes';
33
import { Context } from 'koa';
44

55
import { getFromContainer } from '@/infrastructure/container/container';
6+
import { NetworkMapper } from '@/resources/network/mapper';
67
import { ShowMapper } from '@/resources/show/mapper';
8+
import { NetworkService } from '@/services/network/network-service';
79
import { ShowService } from '@/services/show/show-service';
810
import { discoverSeries, network } from '@/services/tmdb/show';
911

@@ -38,18 +40,38 @@ const lookupByIdMinified = async (ctx: Context) => {
3840
};
3941

4042
const discoverSeriesData = async (ctx: Context) => {
41-
const body = ctx.request.body as any;
43+
const service = getFromContainer(ShowService);
44+
const mapper = getFromContainer(ShowMapper);
4245

43-
const page = body.page ? body.page : 1;
44-
const { params } = body;
46+
const { page } = (ctx.request.body as any) || 1;
47+
const { with_networks } = ctx.query;
48+
49+
const results = await service.getDiscover({
50+
page,
51+
limit: 30,
52+
filterByNetworkId: with_networks
53+
? parseInt(with_networks as string)
54+
: undefined,
55+
});
4556

4657
ctx.status = StatusCodes.OK;
47-
ctx.body = await discoverSeries(page, params);
58+
ctx.body = {
59+
results: results.map((show) => mapper.toResponse(show)),
60+
};
4861
};
4962

5063
const getNetworkById = async (ctx: Context) => {
64+
const networkResult = await getFromContainer(
65+
NetworkService,
66+
).getNetworkDetails(ctx.params.id);
67+
if (networkResult.isNone()) {
68+
ctx.status = StatusCodes.NOT_FOUND;
69+
return;
70+
}
71+
const network = networkResult.unwrap();
72+
5173
ctx.status = StatusCodes.OK;
52-
ctx.body = await network(ctx.params.id);
74+
ctx.body = getFromContainer(NetworkMapper).toResponse(network);
5375
};
5476

5577
const route = new Router({ prefix: '/show' });

server/src/services/cache/cache-service.ts

+34-10
Original file line numberDiff line numberDiff line change
@@ -65,23 +65,39 @@ export class CacheService {
6565
try {
6666
const results =
6767
await this.cacheProvider.wrap<CommonResourcesCacheResponse>(
68-
'trending',
68+
'resources.common',
6969
async () => {
70-
const [movies, shows, people, networks, companies] =
71-
await Promise.all([
72-
this.movieService.getTrending(),
73-
this.showService.getTrending(),
74-
this.personService.getTrending(),
75-
this.networkService.getNetworks(),
76-
this.companyService.getCompanies(),
77-
]);
78-
70+
const [
71+
movies,
72+
shows,
73+
people,
74+
networks,
75+
companies,
76+
showDiscovery,
77+
movieDiscovery,
78+
] = await Promise.all([
79+
this.movieService.getTrending(30),
80+
this.showService.getTrending(30),
81+
this.personService.getTrending(30),
82+
this.networkService.getNetworks(),
83+
this.companyService.getCompanies(),
84+
this.showService.getDiscover({
85+
page: 1,
86+
limit: 30,
87+
}),
88+
this.movieService.getDiscover({
89+
page: 1,
90+
limit: 30,
91+
}),
92+
]);
7993
return {
8094
movies: movies.map((movie) => movie.getProps()),
8195
shows: shows.map((show) => show.getProps()),
8296
people: people.map((person) => person.getProps()),
8397
networks: networks.map((network) => network.getProps()),
8498
companies: companies.map((company) => company.getProps()),
99+
showDiscovery: showDiscovery.map((show) => show.getProps()),
100+
movieDiscovery: movieDiscovery.map((movie) => movie.getProps()),
85101
};
86102
},
87103
this.defaultCacheTTL,
@@ -96,6 +112,12 @@ export class CacheService {
96112
companies: results.companies.map((company) =>
97113
CompanyEntity.create(company),
98114
),
115+
showDiscovery: results.showDiscovery.map((show) =>
116+
ShowEntity.create(show),
117+
),
118+
movieDiscovery: results.movieDiscovery.map((movie) =>
119+
MovieEntity.create(movie),
120+
),
99121
};
100122
} catch (error) {
101123
this.logger.error({ error }, 'Error storing trending data');
@@ -105,6 +127,8 @@ export class CacheService {
105127
people: [],
106128
networks: [],
107129
companies: [],
130+
showDiscovery: [],
131+
movieDiscovery: [],
108132
};
109133
}
110134
}

server/src/services/cache/types.ts

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export type CommonResourcesCacheResponse = {
1515
people: PersonProps[];
1616
networks: NetworkProps[];
1717
companies: CompanyProps[];
18+
showDiscovery: ShowProps[];
19+
movieDiscovery: MovieProps[];
1820
};
1921

2022
/**
@@ -26,4 +28,6 @@ export type CommonResourcesResponse = {
2628
people: PersonEntity[];
2729
networks: NetworkEntity[];
2830
companies: CompanyEntity[];
31+
showDiscovery: ShowEntity[];
32+
movieDiscovery: MovieEntity[];
2933
};

server/src/services/cron/jobs/discovery-scan.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Service } from 'diod';
22

3-
import { AgendaCronService } from '@/services/cron/agenda-cron';
3+
import { AgendaCronService } from '@/services/cron/agenda-cron-service';
44
import { Jobber } from '@/services/cron/job';
55
import { JobCronName } from '@/services/cron/types';
66
import { DiscoveryService } from '@/services/discovery/discovery';

server/src/services/movie/index.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@ import { MovieService } from '@/services/movie/movie-service';
44
import { FanartMovieProvider } from '@/services/movie/provider/fanart/fanart';
55
import {
66
MovieArtworkProvider,
7+
MovieDiscoverProvider,
78
MovieProvider,
89
MovieRatingProvider,
910
MovieTrendingProvider,
1011
} from '@/services/movie/provider/provider';
11-
import { ServarrMovieRatingProvider } from '@/services/movie/provider/servarr/servarr';
12+
import { ServarrMovieProvider } from '@/services/movie/provider/servarr/servarr';
1213
import { TmdbMovieProvider } from '@/services/movie/provider/tmdb/tmdb';
1314

1415
export default (builder: ContainerBuilder) => {
1516
builder.register(MovieProvider).use(TmdbMovieProvider).asSingleton();
1617
builder.register(MovieArtworkProvider).use(FanartMovieProvider).asSingleton();
17-
builder
18-
.register(MovieRatingProvider)
19-
.use(ServarrMovieRatingProvider)
20-
.asSingleton();
18+
builder.register(MovieRatingProvider).use(ServarrMovieProvider).asSingleton();
2119
builder.register(MovieTrendingProvider).use(TmdbMovieProvider).asSingleton();
20+
builder.register(MovieDiscoverProvider).use(TmdbMovieProvider).asSingleton();
2221
builder.registerAndUse(MovieService).asSingleton();
2322
};

server/src/services/movie/movie-service.ts

+52-3
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,15 @@ import { MovieRepository } from '@/resources/movie/repository';
99
import { CacheProvider } from '@/services/cache/cache-provider';
1010
import {
1111
MovieArtworkProvider,
12+
MovieDiscoverProvider,
1213
MovieProvider,
1314
MovieRatingProvider,
1415
MovieTrendingProvider,
1516
} from '@/services/movie/provider/provider';
16-
import { MovieLookupOptions } from '@/services/movie/types';
17+
import {
18+
MovieDiscoverOptions,
19+
MovieLookupOptions,
20+
} from '@/services/movie/types';
1721

1822
@Service()
1923
export class MovieService {
@@ -36,6 +40,7 @@ export class MovieService {
3640
private artworkProvider: MovieArtworkProvider,
3741
private ratingProvider: MovieRatingProvider,
3842
private trendingProvider: MovieTrendingProvider,
43+
private discoverProvider: MovieDiscoverProvider,
3944
) {
4045
this.logger = logger.child({ module: 'services.movie' });
4146
}
@@ -128,7 +133,7 @@ export class MovieService {
128133
* Retrieves the trending movies.
129134
* @returns A Promise that resolves to an array of MovieEntity objects representing the trending movies.
130135
*/
131-
async getTrending() {
136+
async getTrending(limit: number = 30): Promise<MovieEntity[]> {
132137
const results = await this.cacheProvider.wrap(
133138
`movie.trending`,
134139
async () => {
@@ -138,7 +143,7 @@ export class MovieService {
138143
}
139144
const trending = trendingResults.unwrap();
140145
const data = await Promise.all(
141-
trending.map((movie) =>
146+
trending.slice(0, limit).map((movie) =>
142147
this.getMovie(movie, {
143148
withArtwork: true,
144149
withRating: true,
@@ -174,4 +179,48 @@ export class MovieService {
174179
);
175180
return movieResult.filter((m) => m.isSome()).map((m) => m.unwrap());
176181
}
182+
183+
/**
184+
* Retrieves a list of discovered movies with additional details.
185+
*
186+
* @param limit - The maximum number of movies to retrieve. Defaults to 30.
187+
* @returns A promise that resolves to an array of MovieEntity objects representing the discovered movies.
188+
*/
189+
async getDiscover(options?: MovieDiscoverOptions): Promise<MovieEntity[]> {
190+
try {
191+
const results = await this.cacheProvider.wrap(
192+
`movie.discover`,
193+
async () => {
194+
const discovery = await this.discoverProvider.getDiscover({
195+
page: options?.page || 1,
196+
withCompanyId: options?.withCompanies,
197+
});
198+
if (discovery.isErr()) {
199+
return [];
200+
}
201+
const data = await Promise.all(
202+
discovery
203+
.unwrap()
204+
.slice(0, options?.limit || 30)
205+
.map((movie) =>
206+
this.getMovie(movie, {
207+
withArtwork: true,
208+
withRating: true,
209+
withServer: true,
210+
}),
211+
),
212+
);
213+
return data
214+
.filter((m) => m.isSome())
215+
.map((m) => m.unwrap())
216+
.map((m) => m.getProps());
217+
},
218+
this.defaultCacheTTL,
219+
);
220+
return results.map((m) => MovieEntity.create(m));
221+
} catch (error) {
222+
this.logger.error({ error }, 'Error storing discovered data');
223+
return [];
224+
}
225+
}
177226
}

server/src/services/movie/provider/provider.ts

+13-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,18 @@ export abstract class MovieRatingProvider {
3434
abstract getRatings(id: number): Promise<MovieProviderRatingResponse>;
3535
}
3636

37-
export type MovieTrendingReponse = Result<number[], ExceptionBase>;
37+
export type MovieTrendingResponse = Result<number[], ExceptionBase>;
3838
export abstract class MovieTrendingProvider {
39-
abstract getTrending(): Promise<MovieTrendingReponse>;
39+
abstract getTrending(): Promise<MovieTrendingResponse>;
40+
}
41+
42+
export type MovieDiscoverOptions = {
43+
page?: number;
44+
withCompanyId?: number;
45+
};
46+
export type MovieDiscoverResponse = Result<number[], ExceptionBase>;
47+
export abstract class MovieDiscoverProvider {
48+
abstract getDiscover(
49+
options?: MovieDiscoverOptions,
50+
): Promise<MovieDiscoverResponse>;
4051
}

server/src/services/movie/provider/servarr/servarr.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
} from '@/services/movie/provider/provider';
1515

1616
@Service()
17-
export class ServarrMovieRatingProvider implements MovieRatingProvider {
17+
export class ServarrMovieProvider implements MovieRatingProvider {
1818
/**
1919
* The default time-to-live (TTL) for caching movie ratings data.
2020
* The value is set to 1 day (86400000 milliseconds).

0 commit comments

Comments
 (0)