Files
illusory-mapp/packages/objectstorage/src/data.ts

155 lines
5.2 KiB
TypeScript

import * as v from "valibot";
// File Upload Configuration Schema
export const fileUploadConfigSchema = v.object({
bucketName: v.string(),
region: v.string(),
endpoint: v.string(),
accessKey: v.string(),
secretKey: v.string(),
publicUrl: v.optional(v.string()),
maxFileSize: v.pipe(v.number(), v.integer()), // in bytes
allowedMimeTypes: v.array(v.string()),
allowedExtensions: v.array(v.string()),
});
export type FileUploadConfig = v.InferOutput<typeof fileUploadConfigSchema>;
// File Visibility Schema
export const fileVisibilitySchema = v.picklist([
"public",
"private",
"restricted",
]);
export type FileVisibility = v.InferOutput<typeof fileVisibilitySchema>;
// File Metadata Schema
export const fileMetadataSchema = v.object({
id: v.string(),
filename: v.string(),
originalName: v.string(),
mimeType: v.string(),
size: v.pipe(v.number(), v.integer()),
hash: v.string(),
bucketName: v.string(),
objectKey: v.string(),
r2Url: v.string(),
visibility: fileVisibilitySchema,
userId: v.string(),
metadata: v.optional(v.record(v.string(), v.any())),
tags: v.optional(v.array(v.string())),
uploadedAt: v.date(),
expiresAt: v.optional(v.date()),
});
export type FileMetadata = v.InferOutput<typeof fileMetadataSchema>;
// Upload Result Schema
export const uploadResultSchema = v.object({
success: v.boolean(),
file: v.optional(fileMetadataSchema),
error: v.optional(v.string()),
uploadId: v.optional(v.string()),
});
export type UploadResult = v.InferOutput<typeof uploadResultSchema>;
// Presigned URL Result Schema
export const presignedUrlResultSchema = v.object({
uploadUrl: v.string(),
downloadUrl: v.optional(v.string()),
expiresIn: v.pipe(v.number(), v.integer()),
fields: v.optional(v.record(v.string(), v.any())),
});
export type PresignedUrlResult = v.InferOutput<typeof presignedUrlResultSchema>;
// File Validation Result Schema
export const fileValidationResultSchema = v.object({
isValid: v.boolean(),
errors: v.array(v.string()),
warnings: v.array(v.string()),
});
export type FileValidationResult = v.InferOutput<
typeof fileValidationResultSchema
>;
// Image Resize Options Schema
export const imageResizeOptionsSchema = v.object({
width: v.optional(v.pipe(v.number(), v.integer())),
height: v.optional(v.pipe(v.number(), v.integer())),
fit: v.optional(
v.picklist(["cover", "contain", "fill", "inside", "outside"]),
),
});
export type ImageResizeOptions = v.InferOutput<typeof imageResizeOptionsSchema>;
// Thumbnail Size Schema
export const thumbnailSizeSchema = v.object({
width: v.pipe(v.number(), v.integer()),
height: v.pipe(v.number(), v.integer()),
});
export type ThumbnailSize = v.InferOutput<typeof thumbnailSizeSchema>;
// Image Processing Options Schema
export const imageProcessingOptionsSchema = v.object({
resize: v.optional(imageResizeOptionsSchema),
format: v.optional(v.picklist(["jpeg", "png", "webp", "avif"])),
quality: v.optional(v.pipe(v.number(), v.integer())),
generateThumbnail: v.optional(v.boolean()),
thumbnailSize: v.optional(thumbnailSizeSchema),
});
export type ImageProcessingOptions = v.InferOutput<
typeof imageProcessingOptionsSchema
>;
// File Processing Result Schema
export const fileProcessingResultSchema = v.object({
processed: v.boolean(),
originalFile: v.optional(v.instance(Uint8Array)), // Buffer equivalent
processedFile: v.optional(v.instance(Uint8Array)), // Buffer equivalent
thumbnail: v.optional(v.instance(Uint8Array)), // Buffer equivalent
metadata: v.optional(v.record(v.string(), v.any())),
error: v.optional(v.string()),
});
export type FileProcessingResult = v.InferOutput<
typeof fileProcessingResultSchema
>;
// File Security Result Schema (from utils.ts)
export const fileSecurityResultSchema = v.object({
isSecure: v.boolean(),
issues: v.array(v.string()),
warnings: v.array(v.string()),
});
export type FileSecurityResult = v.InferOutput<typeof fileSecurityResultSchema>;
// Document Processing Options Schema
export const documentProcessingOptionsSchema = v.object({
extractText: v.optional(v.boolean()),
generatePreview: v.optional(v.boolean()),
extractMetadata: v.optional(v.boolean()),
validateStructure: v.optional(v.boolean()),
});
export type DocumentProcessingOptions = v.InferOutput<
typeof documentProcessingOptionsSchema
>;
// Video Processing Options Schema
export const videoProcessingOptionsSchema = v.object({
generateThumbnail: v.optional(v.boolean()),
extractMetadata: v.optional(v.boolean()),
thumbnailTimestamp: v.optional(v.number()), // Seconds into video for thumbnail
thumbnailSize: v.optional(thumbnailSizeSchema),
});
export type VideoProcessingOptions = v.InferOutput<
typeof videoProcessingOptionsSchema
>;
// Upload Options Schema (used in client.ts)
export const uploadOptionsSchema = v.object({
visibility: v.optional(fileVisibilitySchema),
metadata: v.optional(v.record(v.string(), v.any())),
tags: v.optional(v.array(v.string())),
processImage: v.optional(v.boolean()),
processDocument: v.optional(v.boolean()),
processVideo: v.optional(v.boolean()),
});
export type UploadOptions = v.InferOutput<typeof uploadOptionsSchema>;