Files
k-photos/libertas-frontend/src/services/media-service.ts

88 lines
2.1 KiB
TypeScript

import type { Media, MediaDetails, PaginatedResponse } from "@/domain/types"
import apiClient from "@/services/api-client"
type MediaListParams = {
page: number;
limit: number;
sort_by?: string;
order?: "asc" | "desc";
mime_type?: string;
};
const API_PREFIX = import.meta.env.VITE_PREFIX_PATH || "";
export const processMediaUrls = (media: Media): Media => ({
...media,
file_url: `${API_PREFIX}${media.file_url}`,
thumbnail_url: media.thumbnail_url
? `${API_PREFIX}${media.thumbnail_url}`
: null,
});
/**
* Fetches a paginated list of media.
*/
export const getMediaList = async ({
page,
limit,
sort_by,
order,
mime_type,
}: MediaListParams): Promise<PaginatedResponse<Media>> => {
const { data } = await apiClient.get("/media", {
params: { page, limit, sort_by, order, mime_type },
});
data.data = data.data.map(processMediaUrls);
return data;
};
/**
* Uploads a new media file.
*/
export const uploadMedia = async (
file: File,
onProgress: (progress: number) => void,
): Promise<Media> => {
const formData = new FormData();
formData.append("file", file);
const { data } = await apiClient.post("/media", formData, {
headers: {
"Content-Type": "multipart/form-data",
},
onUploadProgress: (progressEvent) => {
const percentCompleted = Math.round(
(progressEvent.loaded * 100) / (progressEvent.total ?? 100),
);
onProgress(percentCompleted);
},
});
// Process the single media object returned by the upload
return processMediaUrls(data);
};
/**
* Fetches the details for a single media item.
*/
export const getMediaDetails = async (
mediaId: string,
): Promise<MediaDetails> => {
const { data } = await apiClient.get(`/media/${mediaId}`);
console.log('Data for media details: ', data);
// Process the media URLs in the details response
data.file_url = `${API_PREFIX}${data.file_url}`;
data.thumbnail_url = data.thumbnail_url
? `${API_PREFIX}${data.thumbnail_url}`
: null;
return data;
};
/**
* Deletes a media item by its ID.
*/
export const deleteMedia = async (mediaId: string): Promise<void> => {
await apiClient.delete(`/media/${mediaId}`);
};