# file

## Client

- Query:
  `fileMetasQueryOptions`
  `fileThumbnailQueryOptions`
  `fileQueryOptions`
- Mutation:
  `downloadFileMutationOptions`
  `openFileMutationOptions`
  `updateFileMetaMutationOptions`
  `deleteFileMutationOptions`
  `batchDeleteFilesMutationOptions`
- Hooks:
  `useUploadFile`

## Server

- Fetch:
  `getFileMetas`
  `getFileThumbnail`
  `getFile`
  `downloadFile`.
- Mutate:
  `updateFileMeta`
  `deleteFile`
  `batchDeleteFiles`
  `uploadFile`

## Schemas/Models

```ts
const FileMetaSchema = z.object({
  id: z.uuid(),
  subId: z.uuid(),
  appName: z.string().trim().min(1).max(255),
  fileName: z.string().trim().min(1).max(255),
  fileExtension: z.string().trim().min(1).max(255),
  fileSize: z.number().min(0),
  mediaSubType: z.string().trim().min(1).max(255),
  mediaType: z.string().trim().min(1).max(255),
  mimeType: z.string().trim().min(1).max(255),
  createdBy: z.string().trim().min(1).max(255),
  createdDate: z.date(),
});

const FileActionsSchema = z.object({
  download: z.boolean().optional(),
  delete: z.boolean().optional(),
});

const GetFileMetasSchema = z.object({
  appName: z.string().min(1).max(255),
  subId: z.uuid(),
});

const FileSchema = z.object({
  appName: z.string().min(1).max(255),
  id: z.uuid(),
});

const UpdateFileMetaSchema = FileMetaSchema.extend({
  fileName: z.string().min(1).max(255),
});

const UploadFileMetaSchema = z.object({
  appName: z.string().min(1).max(255),
  subId: z.uuid(),
  file: z.instanceof(File),
});
```

## Examples

```ts
import { fileMetasQueryOptions } from "wcz-layout/data/client";
import { uploadFile } from "wcz-layout/data/server";

// client
const { data: files = [] } = useQuery(fileMetasQueryOptions({ appName, subId }));

// server
await uploadFile({ data: { appName, subId, file } });
```
