mirror of
				https://github.com/zoriya/Kyoo.git
				synced 2025-11-03 19:17:16 -05:00 
			
		
		
		
	Start series insert
This commit is contained in:
		
							parent
							
								
									470a8deae9
								
							
						
					
					
						commit
						962672e4ed
					
				@ -1,29 +1,37 @@
 | 
				
			|||||||
import { Value } from "@sinclair/typebox/value";
 | 
					import { Value } from "@sinclair/typebox/value";
 | 
				
			||||||
import Elysia from "elysia";
 | 
					import Elysia from "elysia";
 | 
				
			||||||
import { KError } from "~/models/error";
 | 
					import { KError } from "~/models/error";
 | 
				
			||||||
import { Movie, SeedMovie } from "~/models/movie";
 | 
					import { SeedMovie } from "~/models/movie";
 | 
				
			||||||
 | 
					import { SeedSerie } from "~/models/serie";
 | 
				
			||||||
import { Resource } from "~/models/utils";
 | 
					import { Resource } from "~/models/utils";
 | 
				
			||||||
import { comment } from "~/utils";
 | 
					import { comment } from "~/utils";
 | 
				
			||||||
import { SeedMovieResponse, seedMovie } from "./movies";
 | 
					import { SeedMovieResponse, seedMovie } from "./movies";
 | 
				
			||||||
 | 
					import { SeedSerieResponse, seedSerie } from "./series";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const seed = new Elysia()
 | 
					export const seed = new Elysia()
 | 
				
			||||||
	.model({
 | 
						.model({
 | 
				
			||||||
		movie: Movie,
 | 
					 | 
				
			||||||
		"seed-movie": SeedMovie,
 | 
							"seed-movie": SeedMovie,
 | 
				
			||||||
		"seed-movie-response": SeedMovieResponse,
 | 
							"seed-movie-response": SeedMovieResponse,
 | 
				
			||||||
 | 
							"seed-serie": SeedSerie,
 | 
				
			||||||
 | 
							"seed-serie-response": SeedSerieResponse,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	.post(
 | 
						.post(
 | 
				
			||||||
		"/movies",
 | 
							"/movies",
 | 
				
			||||||
		async ({ body, error }) => {
 | 
							async ({ body, error }) => {
 | 
				
			||||||
			// needed due to https://github.com/elysiajs/elysia/issues/671
 | 
								// needed due to https://github.com/elysiajs/elysia/issues/671
 | 
				
			||||||
			body = Value.Decode(SeedMovie, body);
 | 
								const movie = Value.Decode(SeedMovie, body) as SeedMovie;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			const ret = await seedMovie(body);
 | 
								const ret = await seedMovie(movie);
 | 
				
			||||||
			if (ret.status === 422) return error(422, ret);
 | 
								if ("status" in ret) return error(ret.status, ret as any);
 | 
				
			||||||
			return error(ret.status, ret);
 | 
								return error(ret.updated ? 200 : 201, ret);
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			body: "seed-movie",
 | 
								detail: {
 | 
				
			||||||
 | 
									tags: ["movies"],
 | 
				
			||||||
 | 
									description:
 | 
				
			||||||
 | 
										"Create a movie & all related metadata. Can also link videos.",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								body: SeedMovie,
 | 
				
			||||||
			response: {
 | 
								response: {
 | 
				
			||||||
				200: {
 | 
									200: {
 | 
				
			||||||
					...SeedMovieResponse,
 | 
										...SeedMovieResponse,
 | 
				
			||||||
@ -31,18 +39,47 @@ export const seed = new Elysia()
 | 
				
			|||||||
				},
 | 
									},
 | 
				
			||||||
				201: { ...SeedMovieResponse, description: "Created a new movie." },
 | 
									201: { ...SeedMovieResponse, description: "Created a new movie." },
 | 
				
			||||||
				409: {
 | 
									409: {
 | 
				
			||||||
					...Resource,
 | 
										...Resource(),
 | 
				
			||||||
					description: comment`
 | 
										description: comment`
 | 
				
			||||||
						A movie with the same slug but a different air date already exists.
 | 
											A movie with the same slug but a different air date already exists.
 | 
				
			||||||
						Change the slug and re-run the request.
 | 
											Change the slug and re-run the request.
 | 
				
			||||||
					`,
 | 
										`,
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				422: { ...KError, description: "Invalid schema in body." },
 | 
									422: KError,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						.post(
 | 
				
			||||||
 | 
							"/series",
 | 
				
			||||||
 | 
							async ({ body, error }) => {
 | 
				
			||||||
 | 
								// needed due to https://github.com/elysiajs/elysia/issues/671
 | 
				
			||||||
 | 
								const serie = Value.Decode(SeedSerie, body) as SeedSerie;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								const ret = await seedSerie(serie);
 | 
				
			||||||
 | 
								if ("status" in ret) return error(ret.status, ret as any);
 | 
				
			||||||
 | 
								return error(ret.updated ? 200 : 201, ret);
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
			detail: {
 | 
								detail: {
 | 
				
			||||||
				tags: ["movies"],
 | 
									tags: ["series"],
 | 
				
			||||||
				description:
 | 
									description:
 | 
				
			||||||
					"Create a movie & all related metadata. Can also link videos.",
 | 
										"Create a series & all related metadata. Can also link videos.",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								body: SeedSerie,
 | 
				
			||||||
 | 
								response: {
 | 
				
			||||||
 | 
									200: {
 | 
				
			||||||
 | 
										...SeedSerieResponse,
 | 
				
			||||||
 | 
										description: "Existing serie edited/updated.",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									201: { ...SeedSerieResponse, description: "Created a new serie." },
 | 
				
			||||||
 | 
									409: {
 | 
				
			||||||
 | 
										...Resource(),
 | 
				
			||||||
 | 
										description: comment`
 | 
				
			||||||
 | 
											A serie with the same slug but a different air date already exists.
 | 
				
			||||||
 | 
											Change the slug and re-run the request.
 | 
				
			||||||
 | 
										`,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									422: KError,
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										51
									
								
								api/src/controllers/seed/series.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								api/src/controllers/seed/series.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					import { t } from "elysia";
 | 
				
			||||||
 | 
					import type { SeedSerie } from "~/models/serie";
 | 
				
			||||||
 | 
					import { getYear } from "~/utils";
 | 
				
			||||||
 | 
					import { insertShow } from "./insert/shows";
 | 
				
			||||||
 | 
					import { guessNextRefresh } from "./refresh";
 | 
				
			||||||
 | 
					import { insertEntries } from "./insert/entries";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const SeedSerieResponse = t.Object({
 | 
				
			||||||
 | 
						id: t.String({ format: "uuid" }),
 | 
				
			||||||
 | 
						slug: t.String({ format: "slug", examples: ["bubble"] }),
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					export type SeedSerieResponse = typeof SeedSerieResponse.static;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const seedSerie = async (
 | 
				
			||||||
 | 
						seed: SeedSerie,
 | 
				
			||||||
 | 
					): Promise<
 | 
				
			||||||
 | 
						| (SeedSerieResponse & { updated: boolean })
 | 
				
			||||||
 | 
						| { status: 409; id: string; slug: string }
 | 
				
			||||||
 | 
						| { status: 422; message: string }
 | 
				
			||||||
 | 
					> => {
 | 
				
			||||||
 | 
						if (seed.slug === "random") {
 | 
				
			||||||
 | 
							if (!seed.startAir) {
 | 
				
			||||||
 | 
								return {
 | 
				
			||||||
 | 
									status: 422,
 | 
				
			||||||
 | 
									message: "`random` is a reserved slug. Use something else.",
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							seed.slug = `random-${getYear(seed.startAir)}`;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const { translations, seasons, entries, ...serie } = seed;
 | 
				
			||||||
 | 
						const nextRefresh = guessNextRefresh(serie.startAir ?? new Date());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const ret = await insertShow(
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								kind: "serie",
 | 
				
			||||||
 | 
								nextRefresh,
 | 
				
			||||||
 | 
								...serie,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							translations,
 | 
				
			||||||
 | 
						);
 | 
				
			||||||
 | 
						if ("status" in ret) return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const retEntries = await insertEntries(ret.pk, entries);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return {
 | 
				
			||||||
 | 
							updated: ret.updated,
 | 
				
			||||||
 | 
							id: ret.id,
 | 
				
			||||||
 | 
							slug: ret.slug,
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user