diff --git a/src/routes/api/albums/[id]/+server.ts b/src/routes/api/albums/[id]/+server.ts index b65921e..587fddf 100644 --- a/src/routes/api/albums/[id]/+server.ts +++ b/src/routes/api/albums/[id]/+server.ts @@ -1,4 +1,5 @@ import type { RequestHandler } from './$types' +import type { Prisma } from '@prisma/client' import { prisma } from '$lib/server/database' import { jsonResponse, @@ -89,7 +90,7 @@ export const PUT: RequestHandler = async (event) => { coverPhotoId?: number status?: string showInUniverse?: boolean - content?: any + content?: Prisma.JsonValue }>(event.request) if (!body) { diff --git a/src/routes/api/albums/[id]/photos/+server.ts b/src/routes/api/albums/[id]/photos/+server.ts index 996d362..9d12433 100644 --- a/src/routes/api/albums/[id]/photos/+server.ts +++ b/src/routes/api/albums/[id]/photos/+server.ts @@ -143,7 +143,7 @@ export const PUT: RequestHandler = async (event) => { }>(event.request) // Also support legacy photoId parameter - const mediaId = body?.mediaId || (body as any)?.photoId + const mediaId = body?.mediaId || (body as Record)?.photoId if (!mediaId || body?.displayOrder === undefined) { return errorResponse('Media ID and display order are required', 400) } diff --git a/src/routes/api/lastfm/+server.ts b/src/routes/api/lastfm/+server.ts index dbaa843..0fc0f68 100644 --- a/src/routes/api/lastfm/+server.ts +++ b/src/routes/api/lastfm/+server.ts @@ -104,7 +104,7 @@ async function getRecentAlbums( recentTracksResponse = JSON.parse(cached) // Convert date strings back to Date objects if (recentTracksResponse.tracks) { - recentTracksResponse.tracks = recentTracksResponse.tracks.map((track: any) => ({ + recentTracksResponse.tracks = recentTracksResponse.tracks.map((track) => ({ ...track, date: track.date ? new Date(track.date) : undefined })) diff --git a/src/routes/api/media/+server.ts b/src/routes/api/media/+server.ts index e6d27bd..d25dd46 100644 --- a/src/routes/api/media/+server.ts +++ b/src/routes/api/media/+server.ts @@ -1,4 +1,5 @@ import type { RequestHandler } from './$types' +import type { Prisma } from '@prisma/client' import { prisma } from '$lib/server/database' import { jsonResponse, @@ -29,7 +30,7 @@ export const GET: RequestHandler = async (event) => { const albumId = event.url.searchParams.get('albumId') // Build where clause - const whereConditions: any[] = [] + const whereConditions: Prisma.MediaWhereInput[] = [] // Handle mime type filtering if (mimeType && mimeType !== 'all') { @@ -149,7 +150,7 @@ export const GET: RequestHandler = async (event) => { : {} // Build orderBy clause based on sort parameter - let orderBy: any = { createdAt: 'desc' } // default to newest + let orderBy: Prisma.MediaOrderByWithRelationInput = { createdAt: 'desc' } // default to newest switch (sort) { case 'oldest': diff --git a/src/routes/api/media/[id]/+server.ts b/src/routes/api/media/[id]/+server.ts index 44c1761..1177675 100644 --- a/src/routes/api/media/[id]/+server.ts +++ b/src/routes/api/media/[id]/+server.ts @@ -128,7 +128,7 @@ export const DELETE: RequestHandler = async (event) => { } // Check if media is in use - if (media.usedIn && (media.usedIn as any[]).length > 0) { + if (media.usedIn && Array.isArray(media.usedIn) && media.usedIn.length > 0) { return errorResponse('Cannot delete media that is in use', 409) } diff --git a/src/routes/api/media/bulk-upload/+server.ts b/src/routes/api/media/bulk-upload/+server.ts index f521e5b..1649808 100644 --- a/src/routes/api/media/bulk-upload/+server.ts +++ b/src/routes/api/media/bulk-upload/+server.ts @@ -51,7 +51,7 @@ async function extractExifData(file: File) { if (!exif) return null // Format EXIF data - const formattedExif: any = {} + const formattedExif: ExifData = {} // Camera info if (exif.Make && exif.Model) { diff --git a/src/routes/api/media/upload/+server.ts b/src/routes/api/media/upload/+server.ts index 24f078c..02bf75e 100644 --- a/src/routes/api/media/upload/+server.ts +++ b/src/routes/api/media/upload/+server.ts @@ -1,4 +1,5 @@ import type { RequestHandler } from './$types' +import type { Prisma } from '@prisma/client' import { prisma } from '$lib/server/database' import { uploadFile, isCloudinaryConfigured } from '$lib/server/cloudinary' import { jsonResponse, errorResponse, checkAdminAuth } from '$lib/server/api-utils' @@ -6,8 +7,27 @@ import { logger } from '$lib/server/logger' import { dev } from '$app/environment' import exifr from 'exifr' +// Type for formatted EXIF data +interface ExifData { + camera?: string + lens?: string + focalLength?: string + aperture?: string + shutterSpeed?: string + iso?: number + dateTaken?: string + gps?: { + latitude: number + longitude: number + altitude?: number + } + orientation?: number + colorSpace?: string + [key: string]: unknown +} + // Helper function to extract and format EXIF data -async function extractExifData(file: File): Promise { +async function extractExifData(file: File): Promise { try { const buffer = await file.arrayBuffer() const exif = await exifr.parse(buffer, { @@ -33,7 +53,7 @@ async function extractExifData(file: File): Promise { if (!exif) return null // Format the data into a more usable structure - const formattedExif: any = {} + const formattedExif: ExifData = {} if (exif.Make && exif.Model) { formattedExif.camera = `${exif.Make} ${exif.Model}`.trim() diff --git a/src/routes/api/photos/+server.ts b/src/routes/api/photos/+server.ts index 47e4f23..402ee2d 100644 --- a/src/routes/api/photos/+server.ts +++ b/src/routes/api/photos/+server.ts @@ -1,9 +1,30 @@ import type { RequestHandler } from './$types' +import type { Prisma } from '@prisma/client' import { prisma } from '$lib/server/database' import { jsonResponse, errorResponse } from '$lib/server/api-utils' import { logger } from '$lib/server/logger' import type { PhotoItem, PhotoAlbum, Photo } from '$lib/types/photos' +// Type for media with photo fields +interface PhotoMedia { + id: number + photoSlug: string | null + filename: string + url: string + thumbnailUrl: string | null + width: number | null + height: number | null + dominantColor: string | null + colors: Prisma.JsonValue + aspectRatio: number | null + photoCaption: string | null + photoTitle: string | null + photoDescription: string | null + createdAt: Date + photoPublishedAt: Date | null + exifData: Prisma.JsonValue +} + // GET /api/photos - Get individual photos only (albums excluded from collection) export const GET: RequestHandler = async (event) => { try { @@ -39,11 +60,11 @@ export const GET: RequestHandler = async (event) => { }) // Helper function to extract date from EXIF data - const getPhotoDate = (media: any): Date => { + const getPhotoDate = (media: PhotoMedia): Date => { // Try to get date from EXIF data if (media.exifData && typeof media.exifData === 'object') { // Check for common EXIF date fields - const exif = media.exifData as any + const exif = media.exifData as Record const dateTaken = exif.DateTimeOriginal || exif.DateTime || exif.dateTaken if (dateTaken) { // Parse EXIF date format (typically "YYYY:MM:DD HH:MM:SS") diff --git a/src/routes/api/posts/+server.ts b/src/routes/api/posts/+server.ts index 3140afe..962d31a 100644 --- a/src/routes/api/posts/+server.ts +++ b/src/routes/api/posts/+server.ts @@ -1,4 +1,5 @@ import type { RequestHandler } from './$types' +import type { Prisma } from '@prisma/client' import { prisma } from '$lib/server/database' import { jsonResponse, @@ -29,7 +30,7 @@ export const GET: RequestHandler = async (event) => { const postType = event.url.searchParams.get('postType') // Build where clause - const where: any = {} + const where: Prisma.PostWhereInput = {} if (status) { where.status = status } diff --git a/src/routes/api/posts/[id]/+server.ts b/src/routes/api/posts/[id]/+server.ts index 39d975a..fce7be4 100644 --- a/src/routes/api/posts/[id]/+server.ts +++ b/src/routes/api/posts/[id]/+server.ts @@ -1,4 +1,5 @@ import type { RequestHandler } from './$types' +import type { Prisma } from '@prisma/client' import { prisma } from '$lib/server/database' import { jsonResponse, errorResponse, checkAdminAuth } from '$lib/server/api-utils' import { logger } from '$lib/server/logger' @@ -175,7 +176,7 @@ export const PATCH: RequestHandler = async (event) => { } } - const updateData: any = {} + const updateData: Prisma.PostUpdateInput = {} if (data.status !== undefined) { updateData.status = data.status