diff --git a/src/constants/core/constants.ts b/src/constants/core/constants.ts index 9f2f477..911e951 100644 --- a/src/constants/core/constants.ts +++ b/src/constants/core/constants.ts @@ -54,3 +54,15 @@ export const CORE_VALIDATIONS = { export const HASH_ALGORITHMS = ['XXH64'] as const; export type HashAlgorithm = (typeof HASH_ALGORITHMS)[number]; + +export const MAX_ZOOM_LEVEL = 22; + +/* eslint-disable @typescript-eslint/naming-convention */ +export const SourceType = { + S3: 'S3', + GPKG: 'GPKG', + FS: 'FS', +} as const; +/* eslint-enable @typescript-eslint/naming-convention */ + +export type SourceType = (typeof SourceType)[keyof typeof SourceType]; diff --git a/src/constants/export/constants.ts b/src/constants/export/constants.ts index b5a6ac8..26c58b4 100644 --- a/src/constants/export/constants.ts +++ b/src/constants/export/constants.ts @@ -9,18 +9,11 @@ export const TileFormatStrategy = { MIXED: 'mixed', } as const; -export const SourceType = { - S3: 'S3', - GPKG: 'GPKG', - FS: 'FS', -} as const; - export const ExportFinalizeType = { Full_Processing: 'FullProcessing', Error_Callback: 'ErrorCallback', } as const; export type TileFormatStrategy = (typeof TileFormatStrategy)[keyof typeof TileFormatStrategy]; -export type SourceType = (typeof SourceType)[keyof typeof SourceType]; export type ExportFinalizeType = (typeof ExportFinalizeType)[keyof typeof ExportFinalizeType]; /* eslint-disable @typescript-eslint/naming-convention */ diff --git a/src/schemas/core/tile.schema.ts b/src/schemas/core/tile.schema.ts new file mode 100644 index 0000000..e04087e --- /dev/null +++ b/src/schemas/core/tile.schema.ts @@ -0,0 +1,29 @@ +import { z } from 'zod'; +import { MAX_ZOOM_LEVEL, SourceType, TileOutputFormat } from '../../constants'; + +export const tileRangeSchema = z.object({ + zoom: z.number().int().min(0).max(MAX_ZOOM_LEVEL), + minX: z.number().int().min(0), + maxX: z.number().int().min(0), + minY: z.number().int().min(0), + maxY: z.number().int().min(0), +}); + +export const tilesDeletionParamsBaseSchema = z.object({ + tilesPath: z.string().min(1), // Base path for the tiles to be deleted + ranges: z.array(tileRangeSchema).min(1), // Array of tile ranges to be deleted + fileExtension: z + .literal(TileOutputFormat.PNG) + .transform((val) => val.toLowerCase()) + .or(z.literal(TileOutputFormat.JPEG).transform((val) => val.toLowerCase())), // File extension of the tiles (e.g., 'png', 'jpeg') +}); + +export const s3TilesDeletionParamsSchema = tilesDeletionParamsBaseSchema.extend({ + sourceProvider: z.literal(SourceType.S3), +}); + +export const fsTilesDeletionParamsSchema = tilesDeletionParamsBaseSchema.extend({ + sourceProvider: z.literal(SourceType.FS), +}); + +export const tilesDeletionParamsSchema = z.discriminatedUnion('sourceProvider', [s3TilesDeletionParamsSchema, fsTilesDeletionParamsSchema]); diff --git a/src/types/core/tile.type.ts b/src/types/core/tile.type.ts new file mode 100644 index 0000000..15570f7 --- /dev/null +++ b/src/types/core/tile.type.ts @@ -0,0 +1,5 @@ +import z from 'zod'; +import { tileRangeSchema, tilesDeletionParamsSchema } from '../../schemas/core/tile.schema'; + +export type TilesDeletionParams = z.infer; +export type TileRange = z.infer;